首页 > 解决方案 > 无法编译内部构造函数调用原因:预期主构造函数调用

问题描述

假设我们有以下主要和次要构造函数:

open class Animal(val name:String){
  internal constructor(message:InputStream): this(readName(message))
}

为什么不能调用超类的内部构造函数?

class Dog(name:String):Animal(name){
   internal constructor(message:InputStream):super(message)
                                             ^^^^^
                                             Primary constructor call expected
}

编辑

显然,当主构造函数转换为辅助构造函数或完全删除时,它会编译。

class Dog:Animal{
   constructor(name:String):super(name)
   internal constructor(message:InputStream):super(message)

}

这是编译器错误吗?

标签: constructorkotlincompilation

解决方案


来自文档

如果类具有主构造函数,则每个辅助构造函数都需要直接或间接通过另一个辅助构造函数委托给主构造函数。this使用关键字完成对同一类的另一个构造函数的委托

和:

如果该类没有主构造函数,则每个辅助构造函数都必须使用super关键字初始化基类型,或者委托给执行此操作的另一个构造函数。


你的Dog类有一个主构造函数,所以你必须使用this. 如果删除主构造函数,您将能够引用super构造函数:

class Dog : Animal {
    constructor(message: InputStream) : super(message)
}

以上没有错误


推荐阅读