Konwertuję część mojego kodu Java do Kotlin i nie do końca rozumiem, jak tworzyć instancje interfejsów, które są zdefiniowane w kodzie Kotlin. Jako przykład mam interfejs (zdefiniowany w kodzie Java):
public interface MyInterface {
void onLocationMeasured(Location location);
}
A potem dalej w moim kodzie Kotlin tworzę instancję tego interfejsu:
val myObj = new MyInterface { Log.d("...", "...") }
i działa dobrze. Jednak kiedy konwertuję MyInterface na Kotlin:
interface MyInterface {
fun onLocationMeasured(location: Location)
}
Otrzymuję komunikat o błędzie: Interface MyListener does not have constructors
kiedy próbuję go utworzyć - chociaż wydaje mi się, że nic się nie zmieniło poza składnią. Czy źle rozumiem, jak działają interfejsy w Kotlinie?
Location -> Unit
) Zamiast interfejsów jednomodowych, jeśli to możliwe - czy to prawda?Najlepszym rozwiązaniem jest użycie aliasu typu zamiast interfejsu Java
typealias MyInterface = (Location) -> Unit
Zarejestruj to w ten sposób:
lub nawet czystszy
Wywołaj to w ten sposób:
Wydaje się, że 3 obecne opcje to:
Konwertując nasze biblioteki na Kotlin, właściwie zostawiliśmy wszystkie interfejsy w kodzie Javy, ponieważ czystsze było wywołanie Javy z Kotlina niż Kotlina z Kotlina.
źródło
Spróbuj uzyskać dostęp do swojego interfejsu w następujący sposób:
źródło
jeśli masz taką klasę Java :
powinieneś przekonwertować ten kod z Java do Kotlin w następujący sposób:
konwertuj interfejs Java :
do stylu interfejsu Kotlin :
źródło
Jeśli interfejs jest przeznaczony dla metody nasłuchującej klasy, zmień definicję interfejsu na typ funkcji. To sprawia, że kod jest bardziej zwięzły. Zobacz poniżej.
Klasa zawierająca definicję detektora
Inna klasa
źródło
źródło