Android Kotlin を使用してアプリを試し始めたところです。 Application のようなクラスを継承したいだけです。
class SomeApp : Application {
}
しかし、コンパイラは警告を発します:
提案により次のように変更されます。
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(){ }
?
これは、プライマリ/セカンダリコンストラクターに関するものではありません。
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
はクラスなので、コンストラクタ(複数ある場合は任意)を呼び出すか、「ここで初期化」します。
必要ない
class SomeApp : Application() {
constructor SomeApp(){
super();
}
}
これは同等だからです。また、クラスにプライマリコンストラクターがある場合は、プライマリコンストラクターのパラメーターを使用して、ベースタイプをその場で初期化できます(必須)。
class SomeApp : Application() {
}
これもJavaと同等です
class SomeApp extends Application {
public SomeApp(){
super();
}
}