【问题标题】:How to fix the conflict when implement two id interfaces?实现两个id接口时如何解决冲突?
【发布时间】:2020-02-19 08:58:54
【问题描述】:

一个接口是'org.springframework.data.domain.Persistable',它是一个java接口,在3rd-party lib中有一个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'

【问题讨论】:

  • 你认为这意味着什么:不能削弱“IdEntry”中“id”的访问权限“public”?
  • 这是来自 IntelliJ IDEA 的错误提示。
  • 是的,我明白了,但你知道这意味着什么吗?你知道 IntelliJ 想告诉你什么吗?
  • 我知道这是什么意思,但不知道如何解决。

标签: kotlin spring-data spring-data-r2dbc spring-data-commons


【解决方案1】:

这是一个平台声明冲突,只要 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 属性生成 getter 和 setter 时,只要它没有 @JvmField 注释,就会发生冲突。

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

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

【讨论】:

  • 当通过 kotlin-1.6.10 编译时,这种方式编译失败,'JvmField cannot be applied to a property that override some other property'。请参阅 youtrack.jetbrains.com/issue/KT-32753>。如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多