我刚开始使用Kotlin试用Android应用。我只想继承这样的Application类:
class SomeApp : Application {
}
但编译器会发出警告:
并建议将其更改为:
class SomeApp : Application() {
override fun onCreate() {
super.onCreate()
}
}
我读到了primary and secondary constructors in the docs。所以如果超类有一个主构造函数,那么有必要在这里写吗?像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(){ }
?
答案 0 :(得分:38)
这不是关于主要/辅助构造函数。
在JVM(以及其他任何其他地方)上创建Application
SomeApp
的构造函数
在Java中,语法就像你说的那样:
class SomeApp : Application {
constructor SomeApp(){
super();
}
}
在这里必须声明constructor
,然后你必须调用超类的构造函数。
在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 A : CharSequence {...}
。但是Application
是一个类,所以你调用一个构造函数(任何,如果有几个),或者“在这里初始化它”。
答案 1 :(得分:7)
您不需要
class SomeApp : Application() {
constructor SomeApp(){
super();
}
}
因为这是等价的。如果类具有主构造函数,则可以(并且必须)使用主构造函数的参数在那里初始化基类型。
class SomeApp : Application() {
}
在java中也相当于
class SomeApp extends Application {
public SomeApp(){
super();
}
}