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

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

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();  
}

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

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

Нужно ли использовать какие-либо дополнительные ключевые слова для параметра id? Что значит "!" значит в подписи?

2 ответа

Решение

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

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

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

    ...
}

Обратите внимание, что этот ответ был адаптирован здесь: /questions/14385338/ustranenie-oshibok-sluchajnogo-pereopredeleniya-v-kotlin/14385344#14385344

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

- РЕДАКТИРОВАТЬ - Александр избил меня до этого! Его ответ лучше в любом случае!;)

Другие вопросы по тегам