Kotlin:'这种类型有一个构造函数,因此必须在这里初始化',但没有声明构造函数

Posted

技术标签:

【中文标题】Kotlin:\'这种类型有一个构造函数,因此必须在这里初始化\',但没有声明构造函数【英文标题】:Kotlin: 'This type has a constructor and thus must be initialized here', but no constructor is declaredKotlin:'这种类型有一个构造函数,因此必须在这里初始化',但没有声明构造函数 【发布时间】:2017-10-29 21:26:18 【问题描述】:

最近开始使用 Kotlin

根据 Kotlin 文档,可以有一个主构造函数和一个或多个辅助构造函数。

我不明白为什么我会看到这个错误

由于test 类没有主构造函数。

这很好用:

open class test 


class test2 : test() 

这是我遇到的另一个困难,当我定义辅助构造函数时,IDE 显示另一个错误提示

如果没有主构造函数,超类型初始化是不可能的

但在前面的工作示例中,我确实对其进行了初始化,但它运行良好。我做错了什么?

【问题讨论】:

Kotlin 构造函数文档中是否涵盖了这一点? kotlinlang.org/docs/reference/classes.html#constructors 【参考方案1】:

您会收到此错误,因为即使您没有在基类中定义主构造函数或辅助构造函数,仍然会为该类生成默认的无参数构造函数。派生类的构造函数应始终调用一些超级构造函数,在您的情况下只有默认的构造函数(这是您可以调用的构造函数,如 test() 以创建类的对象)。编译器和 IDE 会强制您这样做。


超级构造器规则在某种程度上使事情复杂化。

如果在派生类中定义了二级构造函数而没有定义主构造函数(类声明附近没有括号),那么二级构造函数本身应该调用超构造函数,并且在类声明中不应该指定超构造函数参数:

class test2 : test  // no arguments for `test` here
    constructor(a: Int) : super()  /* ... */ 

另一个选项是定义主构造函数并从辅助构造函数调用它:

class test2() : test() 
    constructor(a: Int) : this()  /* ... */ 

【讨论】:

以上是关于Kotlin:'这种类型有一个构造函数,因此必须在这里初始化',但没有声明构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?

Kotlin类与继承

Kotlin的构造函数看这一篇就够了

Kotlin的构造函数看这一篇就够了

为什么Kotlin有两种类型的构造函数?

Kotlin 中这些东西的用途是啥?