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

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

class SomeApp : Application {

}

但是编译器会发出警告:

建议将其更改为:

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

我读到了 primary and secondary constructors in the docs .那么如果父类(super class)有主构造函数,那么这里有必要写吗?像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(){ } ?

最佳答案

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

在 JVM(以及几乎其他任何地方)上,当您创建 SomeApp

的实例时,会调用基类 Application 的构造函数

在 Java 中,语法就像你说的那样:

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

这里你必须声明一个构造函数,然后你必须调用父类(super class)的构造函数。

在 Kotlin 中,概念完全相同相同,但语法更好:

class SomeApp() : Application() {
    ...
}

这里你声明了一个没有参数的构造函数SomeApp(),并说它调用Application(),在这种情况下没有参数。这里的 Application() 与 java 代码 fragment 中的 super() 效果完全相同。

在某些情况下可能会省略一些括号:

class SomeApp : Application()

错误的文本说:这个类型有一个构造函数,因此必须在这里初始化。这意味着 Application 类型是一个类,而不是一个接口(interface)。接口(interface)没有构造函数,因此它们的语法不包括构造函数调用(括号):class A : CharSequence {...}。但是 Application 是一个类,所以你调用一个构造函数(任何一个,如果有的话),或者“在这里初始化它”。

https://stackoverflow.com/questions/34248490/

相关文章:

android - kotlin 和 ArgumentCaptor - IllegalStateEx

kotlin - 如何将可变集合变成不可变集合

properties - Kotlin 中是否有 didSet/willSet 模拟?

kotlin - 'by' 关键字在 Kotlin 中的作用是什么?

android - Unresolved reference DaggerApplicationCo

android - 如何在 kotlin 中使用 Android Support typedef 注

java - 为什么在 Java 中实现返回 Unit 的 Kotlin 函数时必须返回 Unit.

android - Android 中的 AsyncTask 与 Kotlin

function - 如何将空值分配给 Kotlin 中的函数类型变量?

kotlin - 无需额外对象分配的数组/列表迭代