web-dev-qa-db-ja.com

Kotlin:「この型にはコンストラクターがあるため、ここで初期化する必要があります」が、コンストラクターは宣言されていません

最近Kotlinで始めた

Kotlinのドキュメントによると、1つのプライマリコンストラクターと1つ以上のセカンダリコンストラクターが存在する可能性があります。

このエラーが表示される理由がわかりません enter image description here

クラスtestにはプライマリコンストラクターがないためです。

これはうまくいきます:

open class test {
}

class test2 : test() {
}

そして、ここで私が直面した別の困難があります。セカンダリコンストラクターを定義するときにIDEは

スーパータイプの初期化は、プライマリコンストラクターなしでは不可能です enter image description here

しかし、前の作業例では、初期化しましたが、それでもうまくいきました。何が間違っていましたか?

15
Shafayat Alam

このエラーが発生するのは、基本クラスでプライマリまたはセカンダリコンストラクターを定義していなくても、そのクラスに対してデフォルトの引数なしコンストラクターが生成されるためです。派生クラスのコンストラクターは、常にいくつかのスーパーコンストラクターを呼び出す必要があり、あなたの場合にはデフォルトのコンストラクターのみがあります(これは、クラスのオブジェクトを作成するためにtest()のように呼び出すことができるコンストラクターです) 。コンパイラーとIDEはそれを強制します。


スーパーコンストラクタールールは、問題をある程度複雑にします。

プライマリコンストラクターを定義せずに派生クラスでセカンダリコンストラクターを定義する場合(クラス宣言の近くに括弧がない場合)、セカンダリコンストラクター自体がスーパーコンストラクターを呼び出す必要があり、クラス宣言でスーパーコンストラクター引数を指定しないでください:

class test2 : test { // no arguments for `test` here
    constructor(a: Int) : super() { /* ... */ }
}

別のオプションは、プライマリコンストラクタを定義し、セカンダリコンストラクタから呼び出すことです。

class test2() : test() {
    constructor(a: Int) : this() { /* ... */ }
}
29
hotkey