2017-08-13 14 views
3

4番目の2次コンストラクタの値に基づいて条件付きスーパーコールを持つ方法はありますか? なぜこれは機能しませんか?拡張クラスの条件付き分岐スーパー値のKotlin 2次コンストラクタ

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

これは、コンストラクタの引数は、最も一般的なタイプであるAny、以外、何のユニークなタイプを持っていないとして渡さあなたif式として動作しません。あなたは、引数としてAnyを期待して一致するコンストラクタがないので、エラーが発生しています。

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

Javaと同じように、条件付きスーパーコールを作成することはできません。クラスは何の主なコンストラクタを持っていない

場合、各セカンダリコンストラクタ は、superキーワードを使用して基本型を初期化するために持っている、または>他に委任する:スーパータイプはdocumentationを伝えて、直接初期化する必要がありますそれを行うコンストラクタです。この場合、異なる 2次コンストラクタは基本タイプの異なるコンストラクタを呼び出すことができることに注意してください。

+0

私はいくつかの方法を試しましたが、構文を正しく理解できませんでした。 –

+0

私は後ですることができます。私は100%確実ではないので、私は自分の答えを編集しました。私はそれを見てみましょう – s1m0nw1

+0

申し訳ありません@ ersin - ertan私はこれに道を見ることができません – s1m0nw1

関連する問題