web-dev-qa-db-ja.com

この型にはコンストラクターがあり、ここで初期化する必要があります-Kotlin

Android Kotlin を使用してアプリを試し始めたところです。 Application のようなクラスを継承したいだけです。

class SomeApp : Application {

}

しかし、コンパイラは警告を発します:

enter image description here

提案により次のように変更されます。

class SomeApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

ドキュメントのプライマリおよびセカンダリコンストラクタ について読みました。スーパークラスにプライマリコンストラクタがある場合、ここに記述する必要がありますか? Applicationクラスに独自のコンストラクターがあるように

public Application() {
    super(null);
}

その後、派生のためのプライマリコンストラクタを持つ必要がありますか?またはJava way:

class SomeApp : Application {
   constructor SomeApp(){
      super();
    }
}

またはこのエラーは何か他のものを示唆していますか?誰も私を詳細に説明できますか?私はこの言語にとても慣れていないので、これは奇妙に見えます。

編集:Java以下を実行できます:class SomeApp extends Application{ }

暗黙的なコンストラクターがあるため、class SomeApp extends Application{ public Application(){ super(); } }と書く必要はありませんが、kotlinでは、次のように空のコンストラクターを定義する必要があります。class SomeApp:Application(){ }

34
Krupal Shah

これは、プライマリ/セカンダリコンストラクターに関するものではありません。

JVM(および他のほとんどの場所)では、Applicationのインスタンスを作成すると、基本クラスSomeAppのコンストラクターが呼び出されます

Javaの構文はあなたが言った通りです:

_class SomeApp : Application {
    constructor SomeApp(){
      super();
    }
}
_

ここでmustconstructorを宣言し、次にmustスーパークラスのコンストラクターを呼び出します。

Kotlinでは、概念はexactlyと同じですが、構文はより優れています。

_class SomeApp() : Application() {
    ...
}
_

ここでは、パラメータなしでコンストラクタSomeApp()を宣言し、その場合はパラメータなしでApplication()を呼び出すと言います。ここで、Application()は、Javaスニペットでsuper()とまったく同じ効果があります。

また、場合によっては、一部の括弧が省略される場合があります。

_class SomeApp : Application()
_

エラーのテキストには、_This type has a constructor, and thus must be initialized here_と記載されています。つまり、タイプApplicationはインターフェイスではなくクラスです。インターフェイスにはコンストラクターがないため、それらの構文にはコンストラクター呼び出し(ブラケット)が含まれません:_class A : CharSequence {...}_。ただし、Applicationはクラスなので、コンストラクタ(複数ある場合は任意)を呼び出すか、「ここで初期化」します。

44
voddan

必要ない

class SomeApp : Application() {
   constructor SomeApp(){
      super();
    }
}

これは同等だからです。また、クラスにプライマリコンストラクターがある場合は、プライマリコンストラクターのパラメーターを使用して、ベースタイプをその場で初期化できます(必須)。

class SomeApp : Application() {
}

これもJavaと同等です

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}
7
denixtry