Интерфейс Kotlin представляет собой класс java: случайное переопределение

У меня есть сторонняя 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 } 
Intereting Posts
Не удается разрешить символ @ReadOnly и @Mutable в компиляции Kotlin 1.1.0 Запустить один класс kotlin с основной функцией в студии android Spring FacebookTemplate вызывает исключение разрешения для профиля пользователя Как отклонить диалоговое окно предупреждения Android через setOnEditorActionListener? Markdown # против нескольких # Контекст null, внезапно получая NPE после перехода на API 27 Создание класса Parcelable со вторичным конструктором, который принимает список как параметр в Kotlin Как вызвать метод Котлин с более чем одной подобной сигнатурой с лямбдой? gradle multi-project: каталог сборки появляется в корневом каталоге, содержащем артефакты Котлина Какая правильная совпадение версий между kotlin-gradle-plugin и kotlin-js-library? Какова наиболее вероятная причина исключений, загадочно избегающих блока try-catch в этом случае? Скрипт Kotlin не может получить доступ к ресурсам META-INF (persistence.xml) из jar Возможно ли получить доступ к типам Kotlin из Java? Не требуется ли в Котлине? Android Espresso – Как проверить соответствие просмотров до завершения операции?