2017-05-10 73 views
8

我有一個一流的第三方Java庫一樣科特林接口的Java類:意外覆蓋

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

我也有在科特林像

interface XProvider { 
    val x: String? 
} 

接口現在我想延長ThirdParty類並實現XProvider接口。這已經在我的遺留Java代碼做工精細:

public class JavaChild extends ThirdParty implements XProvider {} 

不過,我想寫出儘可能多的科特林越好,我試圖將我的java類科特林。可悲的是,以下不工作:

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() 
+0

你什麼錯誤? – marstran

+0

對不起,忘了。我更新了問題 – dpoetzsch

+0

[解決Kotlin中的意外覆蓋錯誤]的可能的重複(http://stackoverflow.com/questions/32970923/resolving-accidental-override-errors-in-kotlin) – mfulton26

回答

2

XProvider接口和ThirdParty(抽象)類之間的命名衝突。這引起了我的科特林compililer其編譯

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 
} 
+1

我瞭解問題並查看您的解決方法。我在java中有很多'ThirdParty'的子類(在我的例子中是'ParseObject'),我現在想轉換爲kotlin,這就是問題發生的地方。你的解決方案不僅意味着改變很多代碼,而且還會改變我的庫的外部接口('XProperty')。 – dpoetzsch

+0

第二種解決方案是什麼? –

+0

包裝方法意味着我必須包裝我在我的項目中使用的所有公共方法,這在我看來很醜陋。 – dpoetzsch