3

一个接口是'org.springframework.data.domain.Persistable',它是一个Java接口,ID getId()在3rd-party lib中有一个方法。

另一个接口是 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'
4

1 回答 1

3

这是一个平台声明冲突,只要同时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
}

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

getter 与getId()继承自Persistable.

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

于 2020-02-19T09:25:17.407 回答