Я конвертирую часть своего Java-кода в Kotlin, и я не совсем понимаю, как создавать экземпляры интерфейсов, которые определены в Kotlin-коде. В качестве примера у меня есть интерфейс (определенный в коде Java):
public interface MyInterface {
void onLocationMeasured(Location location);
}
А затем в моем коде Kotlin я создаю этот интерфейс:
val myObj = new MyInterface { Log.d("...", "...") }
и работает нормально. Однако, когда я конвертирую MyInterface в Kotlin:
interface MyInterface {
fun onLocationMeasured(location: Location)
}
Я получаю сообщение об ошибке: Interface MyListener does not have constructors
когда я пытаюсь создать его экземпляр - хотя мне кажется, что ничего не изменилось, кроме синтаксиса. Я неправильно понимаю, как работают интерфейсы в Kotlin?
Location -> Unit
), а не интерфейсы с одним методом, если это возможно - это правильно?Лучшее решение - использовать typealias вместо вашего Java-интерфейса.
typealias MyInterface = (Location) -> Unit
Зарегистрируйте это так:
или даже чище
Вызовите это так:
3 текущих варианта:
При преобразовании наших библиотек в Kotlin мы фактически оставили все интерфейсы в коде Java, так как было проще вызывать Java из Kotlin, чем Kotlin из Kotlin.
источник
Попробуйте получить доступ к вашему интерфейсу следующим образом:
источник
если у вас есть класс Java, как это:
Вы должны преобразовать этот код из Java в Kotlin следующим образом:
конвертировать интерфейс Java :
для Котлин интерфейса Стиль:
источник
Если интерфейс предназначен для метода слушателя класса, измените определение интерфейса на тип функции. Это делает код более лаконичным. Смотрите следующее.
Класс, содержащий определение слушателя
Другой класс
источник
источник