Kotlin接口java类:意外覆盖

时间:2017-05-10 13:13:19

标签: java kotlin

我有一个第三方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()

1 个答案:

答案 0 :(得分:2)

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

val x: String?

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

示例:

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