当前位置:  开发笔记 > Android > 正文

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

如何解决《这种类型有一个构造函数,必须在这里初始化--Kotlin》经验,为你挑选了2个好方法。

我刚开始使用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(){ }



1> voddan..:

这不是关于主要/辅助构造函数.

在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是一个类,所以你调用一个构造函数(任何,如果有几个),或"在这里初始化它".



2> denixtry..:

你不需要

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

因为这是等价的.如果类具有主构造函数,则可以(并且必须)使用主构造函数的参数在那里初始化基类型.

class SomeApp : Application() {
}

这在java中也是等价的

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有