2017-08-13 48 views
3

如何基於第四個二級構造函數中的值有條件超級調用? 爲什麼不能工作?擴展類條件分支超值的Kotlin二級構造函數

open class SecondaryConstructors{ 
    constructor(i:Int) 
    constructor(s:String) 
} 
class SecondaryExtended:SecondaryConstructors { 
    constructor(i:Int):super(i) 
    constructor(s:String):super(s) 
    constructor():super(if(true)1 else 0) 
    constructor(intOrString:Boolean):super(if(intOrString) 3 else "hey") 
    // conditional branch result of int/string is implicitly cast to Any 
    // error - none of the following functions can be called with the arguments supplied 
} 
+0

爲什麼你需要這個?在實踐中,我會使用帶有工廠功能的伴侶對象。 – 9000

+0

@ 9000不需要探索,閱讀Kotlin In Action書籍,還需要了解伴侶對象。 –

+1

這在Java中也不能表達。 – ephemient

回答

3

這不會因爲你的if表達通過爲構造函數的參數有沒有獨特的類型,除了Any,這是最常見的類型的工作。你得到一個錯誤,因爲沒有一個匹配的構造函數期望Any作爲參數。

constructor(intOrString:Boolean): 
super(if(intOrString) 3 else "hey") 

作爲一個有條件的超級調用是不可能的,和Java一樣。超類型必須直接初始化,作爲documentation告訴:

如果該類沒有主構造,然後每個次構造 具有使用super關鍵字來初始化基類型,或委託給>另一這樣做的構造函數。請注意,在這種情況下,不同的二級構造函數可以調用基類型的不同構造函數

+0

好的,你能舉個例子嗎,我嘗試了幾種方法,但是沒有得到正確的語法。 –

+0

我以後可以做,因爲我知道我編輯了我的答案,因爲我不完全確定它是否可能。讓我看看它 – s1m0nw1

+0

對不起@ ersin-ertan我看不到這個方法 – s1m0nw1