Kru*_*hah 37 android constructor kotlin kotlin-android-extensions
我刚开始使用Kotlin试用Android应用.我只想继承这样的Application类:
class SomeApp : Application {
}
Run Code Online (Sandbox Code Playgroud)
但是编译器提出了警告:
并建议将其更改为:
class SomeApp : Application() {
override fun onCreate() {
super.onCreate()
}
}
Run Code Online (Sandbox Code Playgroud)
我在文档中读到了主要和辅助构造函数.所以如果超类有一个主构造函数,那么有必要在这里写吗?像Application类有自己的构造函数
public Application() {
super(null);
}
Run Code Online (Sandbox Code Playgroud)
然后有必要有派生的主要构造函数?或者我不能像Java那样做:
class SomeApp : Application {
constructor SomeApp(){
super();
}
}
Run Code Online (Sandbox Code Playgroud)
或者这个错误暗示了其他什么?任何人都可以详细解释我吗?我对这门语言很陌生,这对我来说很奇怪.
编辑:在java中我可以执行以下操作: class SomeApp extends Application{ }
它有隐式构造,所以我没有写:class SomeApp extends Application{ public Application(){ super(); } }但在科特林我必须定义像下面空的构造:
class SomeApp:Application(){ }
?
vod*_*dan 47
这不是关于主要/辅助构造函数.
在JVM(以及其他任何地方),在Application创建实例时调用基类的构造函数SomeApp
在Java中语法就像你说的:
class SomeApp : Application {
constructor SomeApp(){
super();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里你必须声明一个constructor,然后你必须调用超类的构造函数.
在Kotlin中,概念完全相同,但语法更好:
class SomeApp() : Application() {
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,您声明一个SomeApp()没有参数的构造函数,并说它调用Application(),在这种情况下没有参数.这与java片段Application()具有完全相同的效果super().
在某些情况下,可能会省略一些括号:
class SomeApp : Application()
Run Code Online (Sandbox Code Playgroud)
错误的文字说:This type has a constructor, and thus must be initialized here.这意味着类型Application是一个类,而不是一个接口.接口不具有构造,所以对他们的语法不包括构造函数调用(括号内): class A : CharSequence {...}.但是Application是一个类,所以你调用一个构造函数(任何,如果有几个),或"在这里初始化它".
你不需要
class SomeApp : Application() {
constructor SomeApp(){
super();
}
}
Run Code Online (Sandbox Code Playgroud)
因为这是等价的.如果类具有主构造函数,则可以(并且必须)使用主构造函数的参数在那里初始化基类型.
class SomeApp : Application() {
}
Run Code Online (Sandbox Code Playgroud)
这在java中也是等价的
class SomeApp extends Application {
public SomeApp(){
super();
}
}
Run Code Online (Sandbox Code Playgroud)