Как исправить конфликт при реализации двух идентификаторов интерфейсов? - PullRequest
2 голосов
/ 19 февраля 2020

Один интерфейс 'org.springframework.data.domain.Persistable', это java интерфейс с методом ID getId() в сторонней библиотеке.

Другой интерфейс - Kotlin интерфейс interface IdEntry { val id: String}.

Теперь моей бизнес-записи необходимо реализовать эти два интерфейса:

data class MyEntry(
  override val id: String,
  ....// more properties
) : IdEntry, Persistable<String>

Я использую IntelliJ IDE для кодирования, и ошибка:

Class 'MyEntry' is not abstract and does not implement abstract member 
@Nullable public abstract fun getId(): String! 
defined in org.springframework.data.domain.Persistable

Как я могу это исправить?

Я также попробовал ниже код: (идея от здесь )

data class MyEntry(
  private val id: String,
  ....// more properties
) : IdEntry, Persistable<String> {
  override fun getId() = id
  ...
}

Но это также не удалось:

Cannot weaken access privilege 'public' for 'id' in 'IdEntry'

1 Ответ

2 голосов
/ 19 февраля 2020

Это декларация платформы cla sh, которая не может быть легко решена, если MyEntry реализует как IdEntry, так и Persistable.

Однако существует один способ, если вы объявляете свойство, которое наследуется IdEntry как @JvmField:

import org.springframework.data.domain.Persistable

data class MyEntry(@JvmField override var id: String) :
        IdEntry, Persistable<String> {

    override fun getId(): String? = this.id

    override fun isNew(): Boolean {
        TODO("not implemented")
    }
}

interface IdEntry {
    val id: String
}

Это работает, потому что cla sh возникает, когда компилятор Kotlin генерирует методы получения и установки для свойства id как Пока у него нет аннотации @JvmField.

Геттер конфликтует с функцией getId(), унаследованной от Persistable.

При добавлении @JvmField генерация геттера для id из IdEntry избегается, таким образом предотвращая cla sh.

...