Класс данных Kotlin, реализующий интерфейс Java

Я пытаюсь представить Котлина в свой текущий проект. Я решил начать с сущностей, которые, похоже, идеально подходят для классов данных. Например, у меня есть класс данных:

data class Video(val id: Long, val ownerId: Long, val title: String, val description: String? = null, val imgLink: String? = null, val created: Date? = null, val accessKey: String? = null, val views: Long? = null, val comments: Long? = null, val videoLink: String? = null): Entity 

Что реализует интерфейс Java:

 public interface Entity { Long getId(); } 

Но по какой-то причине компилятор не понимает, что этот метод уже реализован:

Класс «Видео» должен быть объявлен абстрактным или реализовать абстрактный элемент public abstract fun getId (): kotlin.Long! определяется в net.alfad.data.Entity

Должен ли я использовать любые дополнительные ключевые слова для id param? Что значит "!" означает в подписи?

    Проблема здесь в том, что Kotlin сначала загружает Java-класс класса Entity и видит getId как функцию, а не как getter некоторого свойства. Свойство getter в классе Kotlin не может переопределить функцию, поэтому id свойства не связан как реализация функции getId .

    Чтобы обойти это, вы должны переопределить исходную функцию getId в своем классе Kotlin. Это приведет к столкновению сигнатур JVM между вашей новой функцией и id get в коде байт-кода, поэтому вам также следует запретить компилятору генерировать getter, сделав свойство private :

     data class Video( private val id: Long, ... ) { override fun getId() = id ... } 

    Обратите внимание, что этот ответ был адаптирован здесь: https://stackoverflow.com/a/32971284/288456

    Если это весь ваш класс данных, то вы не переопределяете getId (). Я вижу, что у вас есть свойство, называемое id, и Kotlin должен генерировать getter для этого, но это не будет отмечено ключевым словом override, который вам нужно указать, что вы переопределяете абстрактную функцию.

    – ИЗМЕНИТЬ – Александр избил меня! В любом случае, его ответ лучше! 😉

    Intereting Posts
    Как использовать с оберткамиDefault? Есть ли официальный путеводитель по Kotlin? Kotlin vs. Java: функция вызова с параметром лямбда Проверка общего типа метода Котлина Тип универсального парного типа для дополнительных целей Каков рекомендуемый способ десериализации документа Firestore, содержащего массив? Неожиданные жетоны (используйте, чтобы разделить выражения в одной строке) в котлин Параллельные сопрограммы Kotlin Kotlin – Как сделать onCompleteListener для получения данных из Firestore? Anko – альтернатива скрыть один вид и показать другое Выбранный в настоящее время отладчик Java не поддерживает точки останова типа «Точки останова линии Котлин», Android Espresso IntentsMatcher работает на новом устройстве, но не в старом Smartcasting на и с платформы типа в kotlin запустить Android-версию 2.3.3 проект kotlin в android studio 3.0.1 после обновления изменять внешний класс через анонимный внутренний объект в котлине