【问题标题】:Kotlin interface a java class: Accidental overrideKotlin 接口一个 java 类:意外覆盖
【发布时间】:2017-05-10 13:13:18
【问题描述】:

我有一个第三方 java 库,其类如

public class ThirdParty  {
    public String getX() {
        return null;
    }
}

我在 kotlin 中也有类似的界面

interface XProvider {
    val x: String?
}

现在我想扩展ThirdParty 类并实现XProvider 接口。这在我的遗留 Java 代码中运行良好:

public class JavaChild extends ThirdParty implements XProvider {}

但是,我想尽可能多地编写 kotlin,并尝试将我的 java 类转换为 kotlin。遗憾的是,以下方法不起作用:

class KotlinChild: ThirdParty(), XProvider

错误是

class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in XProvider

但是,如果我做类似的事情

class KotlinChild1: ThirdParty(), XProvider {
    override val x: String? = null
}

我明白了

error: accidental override: The following declarations have the same JVM signature (getX()Ljava/lang/String;)
    fun <get-x>(): String?
    fun getX(): String!
        override val x: String? = null

有效的是以下丑陋的解决方法:

class KotlinChild: JavaChild()

【问题讨论】:

  • 你得到什么错误?
  • 抱歉,忘记了。我更新了问题
  • 根据那里的答案,如果没有丑陋的 java 解决方法,这是不可能的。那会有点糟糕。

标签: java kotlin


【解决方案1】:

XProvider 接口和 ThirdParty(抽象)类之间存在命名冲突。这是我编译的 Kotlin 编译器造成的

val x: String?

转换为有效的 Java 方法,因为 Java 不支持变量或属性的继承。有效的 Java 方法将具有名称“getX()”。因此,您在 XProvider.getX() 和 ThirdParty.getX() 方法之间存在冲突。所以解决方案可能是在你的 XProvider 类中重命名你的属性“x”。或者,您创建第二个类,其中包含 ThridParty 的实例并实现 XProvider。调用 val x: String 时,您可以通过从第三方实例获取内容来提供内容。

例子:

class ThirdPartyImpl: XProvider {
    private val thridPartyInstance = ThridParty()
    override val x: String? = thirdPartyInstance.x
}

【讨论】:

  • 我了解问题并查看您的解决方法。我在java中有很多ThirdParty(在我的情况下为ParseObject)的子类,我现在正试图转换为kotlin,这就是问题发生的地方。您的解决方案不仅意味着更改大量代码,还意味着更改我的库的外部接口 (XProperty)。
  • 第二个解决方案是什么?
  • 包装方法意味着我必须在内部包装我在项目中使用的所有公共方法,在我看来这也很丑陋。
猜你喜欢
  • 2018-02-19
  • 2018-04-03
  • 2015-12-24
  • 2016-01-03
  • 2015-01-14
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2020-06-14
相关资源
最近更新 更多