Kotlin接口的一个java类:意外覆盖

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

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

 val x: String? 

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

例:

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