实现两个id接口冲突如何解决?

How to fix the conflict when implement two id interfaces?

一个接口是 'org.springframework.data.domain.Persistable',它是一个 java 接口,在第 3 方库中有一个方法 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'

这是一个平台声明冲突,只要 MyEntry 同时实现 IdEntryPersistable.

就无法轻易解决

但是,有一种方法,如果您将 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
}

这是可行的,因为当 Kotlin 编译器为 id 属性 生成 getters 和设置器时会发生冲突,只要它没有 @JvmField 注释。

getter 与继承自 Persistable 的函数 getId() 冲突。

通过添加@JvmField,避免了IdEntryid生成getter,从而避免了冲突。