Heim  >  Artikel  >  Verwendung von Kotlin-Methoden mit Wertklassen beim Signieren von Java-Code

Verwendung von Kotlin-Methoden mit Wertklassen beim Signieren von Java-Code

WBOY
WBOYnach vorne
2024-02-09 08:51:22575Durchsuche

Die Verwendung von Kotlin-Methoden mit Wertklassen beim Signieren von Java-Code ist eine gängige Entwicklungstechnik. Eine Wertklasse ist ein spezieller Typ in Kotlin, der zum Speichern und Übergeben von Daten verwendet werden kann, ähnlich den grundlegenden Datentypen in Java. Durch die Verwendung von Kotlin-Methoden mit Wertklassen im Java-Code können wir die syntaktischen Zucker- und funktionalen Programmierfunktionen von Kotlin voll ausnutzen, um Daten auf prägnante und elegante Weise zu verarbeiten. In diesem Artikel stellen wir die Verwendung von Kotlin-Methoden mit Wertklassen in Java-Code vor und untersuchen deren Vorteile und Überlegungen. Ganz gleich, ob Sie ein Java-Entwickler oder ein Kotlin-Enthusiast sind, dieser Artikel vermittelt Ihnen wertvolles Wissen und Tipps.

Frageninhalt

Ich habe eine Kotlin-Entität wie diese

value class entityid(val id: long) {}

Und einige Serviceschnittstellen

interface service() {
    fun do(entityid: entityid)
}

und seine Umsetzung.

Aber wenn ich eine Schnittstelle aus Java-Code wie unten verwende

{
    ...
    entityid id = new entityid(1l);
    service.do(id) // service is interface here 
}

Ich erhalte Kompilierungsfehler. Dies ist jedoch ein sehr verständliches Verhalten, da der Kotlin-Compiler fun do(entityid: long) aus dem Quellcode generiert. Okay, verwenden wir etwas wie service.do(1l). Es stellt sich noch eine weitere Frage:

java: cannot find symbol
symbol:   method do(long)

Ich vermute, das liegt daran, dass sich die Schnittstelle während der Kompilierung nicht wirklich ändert. Ich habe einen Weg gefunden – füge value class 替换为 data class 但我会有 value class hinzu.

Gibt es vielleicht eine Lösung für diese Situation?

Workaround

Sie können die long 的函数重载采用 value 类 的函数,并在后台调用原始函数。注意 @jvmname 上的 value 类 重载,这样 java 只会看到 long-Überladung verwenden.

Kotlin

@jvminline
value class entityid(val id: long)

class service {
    @jvmname("processentity")
    fun process(entityid: entityid) {        
    }

    fun process(entityid: long) {
        process(entityid(entityid))
    }
}

Sie können es dann von Java aus mit dem long-Literal aufrufen:

service.process(42L);

Das obige ist der detaillierte Inhalt vonVerwendung von Kotlin-Methoden mit Wertklassen beim Signieren von Java-Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen