Класс данных 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? Что значит "!" означает в подписи?

Ответы

Ответ 1

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

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

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

    ...
}

Обратите внимание, что этот ответ был адаптирован отсюда: fooobar.com/questions/358239/...

Ответ 2

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

- EDIT - Александр избил меня! В любом случае, его ответ лучше!;)