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

问题描述 投票:0回答:1

[一个接口是'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'
kotlin spring-data spring-data-r2dbc spring-data-commons
1个回答
0
投票

这是一个平台声明冲突,只要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属性生成吸气剂和设置器时,只要没有@JvmField批注,就会发生冲突。

这些吸气剂与从Persistable继承的功能发生冲突。

通过添加@JvmField,避免了从id生成IdEntry的吸气剂,并避免了冲突。

© www.soinside.com 2019 - 2024. All rights reserved.