[一个接口是'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
如何解决此问题?
我也尝试以下代码:(here的想法)
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
属性生成吸气剂和设置器时,只要没有@JvmField
批注,就会发生冲突。
这些吸气剂与从Persistable
继承的功能发生冲突。
通过添加@JvmField
,避免了从id
生成IdEntry
的吸气剂,并避免了冲突。