У меня есть сторонняя java-библиотека с классом вроде
public class ThirdParty { public String getX() { return null; } }
У меня также есть интерфейс в kotlin, как
interface XProvider { val x: String? }
Теперь я хочу расширить класс ThirdParty
и реализовать интерфейс XProvider
. Это хорошо работает в моем устаревшем Java-коде:
public class JavaChild extends ThirdParty implements XProvider {}
Тем не менее, я хотел бы написать как можно больше kotlin, и я пытаюсь преобразовать свои классы java в kotlin. К сожалению, следующее не работает:
class KotlinChild: ThirdParty(), XProvider
Ошибка
class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in XProvider
Однако, если я сделаю что-то вроде
class KotlinChild1: ThirdParty(), XProvider { override val x: String? = null }
я получил
error: accidental override: The following declarations have the same JVM signature (getX()Ljava/lang/String;) fun <get-x>(): String? fun getX(): String! override val x: String? = null
Что работает: уродливая работа:
class KotlinChild: JavaChild()
У вас есть конфликт имен между интерфейсом XProvider и классом ThirdParty (abstract). Это вызвано моим компилятором Kotlin, который компилирует
val x: String?
в действительный Java-метод, потому что Java не поддерживает наследование переменных или свойств. Действительный метод Java будет иметь имя «getX ()». Таким образом, у вас есть конфликт между методами XProvider.getX () и ThirdParty.getX (). Поэтому решением может быть переименование вашего свойства «x» в вашем классе XProvider. Или вы создаете второй класс, который содержит экземпляр ThridParty и реализует XProvider. Когда вызывается val x: String, вы можете предоставить контент, извлекая его из своего экземпляра ThirdParty.
Пример:
class ThirdPartyImpl: XProvider { private val thridPartyInstance = ThridParty() override val x: String? = thirdPartyInstance.x }