Ich konvertiere einen Teil meines Java-Codes in Kotlin und verstehe nicht ganz, wie man im Kotlin-Code definierte Schnittstellen instanziiert. Als Beispiel habe ich eine Schnittstelle (definiert in Java-Code):
public interface MyInterface {
void onLocationMeasured(Location location);
}
Und weiter in meinem Kotlin-Code instanziiere ich diese Schnittstelle:
val myObj = new MyInterface { Log.d("...", "...") }
und es funktioniert gut. Wenn ich jedoch MyInterface in Kotlin konvertiere:
interface MyInterface {
fun onLocationMeasured(location: Location)
}
Ich erhalte eine Fehlermeldung: Interface MyListener does not have constructors
Wenn ich versuche, sie zu instanziieren - obwohl mir scheint, dass sich außer der Syntax nichts geändert hat. Verstehe ich falsch, wie Schnittstellen in Kotlin funktionieren?
Location -> Unit
) anstelle von Schnittstellen mit nur einer Methode zu verwenden, wenn dies möglich ist - ist das richtig?Die beste Lösung besteht darin, anstelle Ihrer Java-Schnittstelle Typealias zu verwenden
typealias MyInterface = (Location) -> Unit
Registrieren Sie es so:
oder noch sauberer
Rufen Sie es so auf:
Die 3 aktuellen Optionen scheinen zu sein:
Bei der Konvertierung unserer Bibliotheken in Kotlin haben wir tatsächlich alle Schnittstellen in Java-Code belassen, da es sauberer war, Java von Kotlin aus aufzurufen als Kotlin von Kotlin.
quelle
Versuchen Sie, wie folgt auf Ihre Benutzeroberfläche zuzugreifen:
quelle
Wenn Sie eine Java-Klasse wie diese haben:
Sie sollten diesen Code wie folgt von Java nach Kotlin konvertieren :
Java-Schnittstelle konvertieren :
zu Kotlin Interface Style:
quelle
Wenn die Schnittstelle für eine Listener-Methode einer Klasse bestimmt ist, ändern Sie die Schnittstellendefinition in den Funktionstyp. Das macht den Code prägnanter. Siehe folgendes.
Klasse mit Listener-Definition
Eine andere Klasse
quelle
quelle