Intereting Posts
Наблюдение за повторным использованием выполнения оператора Тип вывода с функциональными строителями Как получить Flowable <List <Foo >> из объекта «Bar» с отношениями «один ко многим» «Foo» с использованием realm и Rxjava Как загрузить файл в Kotlin REPL Как я могу называть класс java как A: extends B реализует C в kotlin Я сейчас разрабатываю приложение для Android с Kotlin, но произошла ошибка: CompilationException: не удалось встроить метод в 'readText' locationManager.getBestProvider возвращает значение null для API 15 (API <23) Kotlin Bytecode – Как анализировать в IntelliJ IDEA? Что означает сигнатура функции Kotlin с T. ()? Проверьте, является ли класс допустимым значением для KParameter Невозможно ссылаться на подкласс в Котлине Почему Mockito не может высмеивать общий тип параметра с типом номера в Kotlin? Доступ к свойствам Java bean из Kotlin RecyclerView не является прокручиваемым, а элементный клик не работает в recyclerview ERROR: error.NonExistentClass Kotlin В проекте с несколькими модулями Dagger

Принятие объявления о создании платформы при использовании интерфейса в kotlin

Я конвертирую некоторые классы в Java в kotlin, и я запускаю ошибки компиляции при попытке наследования с интерфейса:

Объявление объявления платформы: следующие объявления имеют одну и ту же подпись JVM (getContentID () Ljava / lang / String;):

public open fun get-content-id (): String? public open fun getContentId (): String?

Вот интерфейс:

interface Media { val contentId: String val displayRunTime: String val genres: List<String> val programId: String val runTime: String val type: String } 

вот класс:

 class Airing : Media { override val contentId: String? = null override val displayRunTime: String? = null override val genres: List<String>? = null override val programId: String? = null override val runTime: String? = null override val type: String? = null override fun getContentId(): String? { return contentId } 

Я супер новичок в Котлине.

Solutions Collecting From Web of "Принятие объявления о создании платформы при использовании интерфейса в kotlin"

Вам не нужно объявлять override fun getContentId(): String? , потому что val contentId: String из интерфейса Media уже переопределяется override val contentId: String? ,

Полученная вами ошибка означает, что функция, объявляющая конфликты в байт-коде JVM с помощью получателя, уже сгенерированного для свойства contentId (у получателя есть такая же подпись).

В Kotlin вы должны работать с свойством contentId напрямую, тогда как в Java вы можете использовать сгенерированные аксессоры getContentId() и setContentId(...) .

Кроме того, Kotlin не позволяет вам переопределить свойство null- String с нулевым String? один, потому что пользователи базового интерфейса ожидают не-нулевое значение свойства. Вы должны заменить переопределенные типы свойств на String или сделать их String? в интерфейсе.

Основная проблема – тип T? включает T и null . в свою очередь, T является подмножеством T? , поэтому вы не можете переопределить свойство T со своим типом надмножества, например:

 interface Source { val content: Any } // v--- ERROR: `Any?` is not a subtype of `Any` class Image(override val content:Any?) : Source 

Однако вы можете переопределить T? свойство с его подтипом или подтипом , например:

 interface Source { val content: Any? } // v--- `Any` is a subset of `Any?` class Image(override val content:Any) : Source // `String` is a subtype of `Any` & `Any?` includes `Any` // v class Text(override val content:String) : Source 

Тогда ваш код должен быть следующим. Тем не менее, Kotlin – это система с нулевой безопасностью, вы не можете определить свойство без его инициализации, даже если свойство является свойством nullable :

 class Airing : Media { // v--- ERROR: the property isn't initialized override val contentId: String ... } 

Вы должны ввести свойства в основной конструктор, чтобы клиентский код инициализировал их в будущем, например:

 class Airing constructor( override val contentId: String, override val displayRunTime: String, override val genres: List<String>, override val programId: String, override val runTime: String, override val type: String ) : Media 

Вы также можете указать значение по умолчанию для свойств, например:

 class Airing : Media { override val contentId: String = "<default>" override val displayRunTime: String = "<default>" override val genres: List<String> = emptyList() override val programId: String = "<default>" override val runTime: String = "<default>" override val type: String = "<default>" } 

И функция getContentId будет конфликтовать с getter , поэтому вы должны удалить ее.

Переменные, объявленные как val , похожи на final переменные Java, являются inmutable, поэтому вы не можете установить как Optional ?

Объявление переменной должно выглядеть следующим образом:

 interface Media { var contentId: String? //... }