我刚刚开始使用 Kotlin 试验 Android 应用程序.我只是想继承Application像这样的类:
class SomeApp : Application {
}
但是编译器会发出警告:
建议将其更改为:
class SomeApp : Application() {
override fun onCreate() {
super.onCreate()
}
}
我读到了 primary and secondary constructors in the docs .那么如果父类(super class)有主构造函数,那么这里有必要写吗?像Application类有自己的构造函数
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(){ }
?
最佳答案
这与主要/次要构造函数无关。
在 JVM(以及几乎其他任何地方)上,当您创建 SomeApp
Application
的构造函数
在 Java 中,语法就像你说的那样:
class SomeApp : Application {
constructor SomeApp(){
super();
}
}
这里你必须声明一个构造函数
,然后你必须调用父类(super class)的构造函数。
在 Kotlin 中,概念完全相同相同,但语法更好:
class SomeApp() : Application() {
...
}
这里你声明了一个没有参数的构造函数SomeApp()
,并说它调用Application()
,在这种情况下没有参数。这里的 Application()
与 java 代码 fragment 中的 super()
效果完全相同。
在某些情况下可能会省略一些括号:
class SomeApp : Application()
错误的文本说:这个类型有一个构造函数,因此必须在这里初始化
。这意味着 Application
类型是一个类,而不是一个接口(interface)。接口(interface)没有构造函数,因此它们的语法不包括构造函数调用(括号):class A : CharSequence {...}
。但是 Application
是一个类,所以你调用一个构造函数(任何一个,如果有的话),或者“在这里初始化它”。
关于android - 这种类型有一个构造函数,必须在这里初始化 - Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34248490/