实现两个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
同时实现 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
}
这是可行的,因为当 Kotlin 编译器为 id
属性 生成 getters 和设置器时会发生冲突,只要它没有 @JvmField
注释。
getter 与继承自 Persistable
的函数 getId()
冲突。
通过添加@JvmField
,避免了IdEntry
为id
生成getter,从而避免了冲突。
一个接口是 '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
同时实现 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
}
这是可行的,因为当 Kotlin 编译器为 id
属性 生成 getters 和设置器时会发生冲突,只要它没有 @JvmField
注释。
getter 与继承自 Persistable
的函数 getId()
冲突。
通过添加@JvmField
,避免了IdEntry
为id
生成getter,从而避免了冲突。