这种类型有一个构造函数,必须在这里初始化 - Kotlin

This type has a constructor and must be initialized here - Kotlin

我刚刚开始使用 Kotlin. I just wanted to inherit Application class 试验 Android 应用,如下所示:

class SomeApp : Application {

}

但编译器发出警告:

建议将其更改为:

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

我读到了 primary and secondary constructors in the docs。那么如果superclass有一个主构造函数,那么这里有必要写吗?比如 Application class 有自己的构造函数

public Application() {
    super(null);
}

那么派生有必要有主构造函数吗?或者我不能做类似 Java 的事情吗:

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

或者此错误提示其他问题?谁能详细解释一下?我对这门语言很陌生,这对我来说很奇怪。

编辑:在 java 中,我可以执行以下操作:class SomeApp extends Application{ }

它有隐式构造函数,所以我不必写:class SomeApp extends Application{ public Application(){ super(); } } 但是在 kotlin 中我必须像下面这样定义空构造函数: class SomeApp:Application(){ }

你不需要

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

因为这是等价的。如果 class 具有主构造函数,则可以(并且必须)使用主构造函数的参数在此处初始化基类型。

class SomeApp : Application() {
}

在java中也等同于

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

这与 primary/secondary 构造函数无关。

在 JVM 上(以及几乎任何其他地方),当您创建 SomeApp

的实例时,将调用基础 class Application 的构造函数

在 Java 中,语法就像你说的那样:

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

在这里你必须声明一个constructor,然后你必须调用超级[=50=的构造函数].

在 Kotlin 中,概念完全相同,但语法更好:

class SomeApp() : Application() {
    ...
}

在这里你声明了一个不带参数的构造函数SomeApp(),并说它调用了Application(),在这种情况下不带参数。这里 Application() 与 java 片段中的 super() 具有完全相同的效果。

在某些情况下,某些括号可能会被省略:

class SomeApp : Application()

错误文本显示:This type has a constructor, and thus must be initialized here。这意味着类型 Application 是一个 class,而不是一个接口。接口没有构造函数,因此它们的语法不包括构造函数调用(方括号):class A : CharSequence {...}。但是 Application 是一个 class,所以你调用一个构造函数(任何,如果有多个),或者 "initialize it here".

转换

class SomeApp : Application {

}

class SomeApp : Application() { // just add ```()``` 

}