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

时间:2015-12-13 06:10:28

标签: android constructor kotlin kotlin-android-extensions

我刚开始使用Kotlin试用Android应用。我只想继承这样的Application类:

class SomeApp : Application {

}

但编译器会发出警告:

enter image description here

并建议将其更改为:

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(){ }

2 个答案:

答案 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();
     }
}