我刚开始使用Kotlin试用Android应用.我只想继承这样的Application类:
class SomeApp : Application { }
但是编译器提出了警告:
并建议将其更改为:
class SomeApp : Application() { override fun onCreate() { super.onCreate() } }
我在文档中读到了主要和辅助构造函数.所以如果超类有一个主构造函数,那么有必要在这里写吗?像Application类有自己的构造函数
public Application() { super(null); }
然后有必要有派生的主要构造函数?或者我不能像Java那样做:
class SomeApp : Application { constructor SomeApp(){ super(); } }
或者这个错误暗示了其他什么?任何人都可以详细解释我吗?我对这门语言很陌生,这对我来说很奇怪.
编辑:在java中我可以执行以下操作: class SomeApp extends Application{ }
它有隐式构造,所以我没有写:class SomeApp extends Application{ public Application(){ super(); } }
但在科特林我必须定义像下面空的构造:
class SomeApp:Application(){ }
?
这不是关于主要/辅助构造函数.
在JVM(以及其他任何地方),在Application
创建实例时调用基类的构造函数SomeApp
在Java中语法就像你说的:
class SomeApp : Application { constructor SomeApp(){ super(); } }
在这里你必须声明一个constructor
,然后你必须调用超类的构造函数.
在Kotlin中,概念完全相同,但语法更好:
class SomeApp() : Application() { ... }
在这里,您声明一个SomeApp()
没有参数的构造函数,并说它调用Application()
,在这种情况下没有参数.这与java片段Application()
具有完全相同的效果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(); } }