46

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

class SomeApp : Application {

}

但是编译器会发出警告:

在此处输入图像描述

并建议将其更改为:

class SomeApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

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

4

2 回答 2

62

这与主要/次要构造函数无关。

在 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 {...}:. ButApplication是一个类,所以你调用一个构造函数(任何,如果有的话),或者“在这里初始化它”。

于 2015-12-13T09:21:16.000 回答
8

你不需要

class SomeApp : Application() {
   constructor SomeApp(){
      super();
    }
}

因为这是等价的。如果该类有一个主构造函数,则可以(并且必须)使用主构造函数的参数在此处初始化基类型。

class SomeApp : Application() {
}

这在java中也等价于

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}
于 2015-12-13T07:40:33.990 回答