2017-07-13 13 views
1
data class DisjointSetNode<T>(var parent: DisjointSetNode<T>, var data: T, var rank: Int) { 
constructor(data: T): this(parent = this, data = data, rank = 0) 

スーパークラスコンストラクタを最初に呼び出さなかったため、コンストラクタ呼び出しでthisキーワードを使用できないというエラーが表示されるのはなぜですか?スーパークラスはなく、自分自身を親にしたい。どのように私はこれを行うに行くのだろうか?Kotlin:このキーワードを持つ2次コンストラクタ

+1

。それにもかかわらず、 'this'はまだ存在しません(' this() 'への呼び出しは事実上それを生み出すものです)。 –

+0

この場合、 'this'はおそらく' parent'プロパティを持たない別のデータクラス全体でなければなりません。 –

答えて

0

問題は、あなたがthis(...)で別のコンストラクタを呼び出す時にthisを呼び出すことができないということです。あなたはJLSを見てとることができます。

それはコンストラクタのコンパイル時エラーです直接またはに間接的にこのを含む一つ以上の明示的なコンストラクタ呼び出しの一連の自分自身を呼び出します。最初の文でthis(...)thisを呼び出す

  • 直接手段、例えば:this(this);this(parent):コールthis(...)、例えば中にそのメンバーを呼び出す

  • 間接的手段。

が、あなたのことができ、たとえば、あなたの方法を達成するために二コンストラクタ主コンストラクタします:おそらく悪いエラーメッセージです

data class DisjointSetNode<T>(var data: T, var rank: Int = 0) { 
    var parent: DisjointSetNode<T> = this 

    constructor(parent: DisjointSetNode<T>, data: T) : this(data = data){ 
     this.parent = parent 
    } 
} 
0

まだ定義されていないため、thisはこのコンテキストでは参照できません。

ただし、parentをコンストラクタの署名の外に移動することはできます。例えば:

data class DisjointSetNode<T>(var data: T, var rank: Int = 0) { 
    var parent: DisjointSetNode<T> = this 
} 
+0

これは、自動的に親を持つDisjointSetNodeをインスタンス化するときの効果がありますか? – user3338275

+0

@ user3338275はい。あなたが新しいクラスを作るとき、創造の順序があります。コンストラクタが最初に来て、その後に(親を含む)他のコンテンツが入ります。 –

関連する問題