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

RJ.*_*ang 5 spring-data kotlin spring-data-commons spring-data-r2dbc

ID getId()其中一个接口是“org.springframework.data.domain.Persistable”,它是一个java接口,具有第3方lib中的方法。

另一个接口是 Kotlin 接口interface IdEntry { val id: String}。

现在我的业务入口需要实现这两个接口:

data class MyEntry(
  override val id: String,
  ....// more properties
) : IdEntry, Persistable<String>
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

我还尝试了下面的代码:(来自这里的想法)

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

但这也失败了:

Cannot weaken access privilege 'public' for 'id' in 'IdEntry'
Run Code Online (Sandbox Code Playgroud)

Eru*_*aro 5

这是一个平台声明冲突,只要MyEntry同时实现IdEntry和就无法轻易解决Persistable。

但是,有一种方法,如果将继承的属性声明IdEntry为 a @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
}
Run Code Online (Sandbox Code Playgroud)

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

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

通过添加,可以避免生成from@JvmField的 getter ,从而防止冲突。idIdEntry