无法编译内部构造函数调用原因:预期的主要构造函数调用

时间:2018-10-23 11:30:05

标签: constructor kotlin compilation

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

"configurations": {
    "dev1": {
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true,
      "fileReplacements": [
        {
          "replace": "src/./environments/environment.ts",
          "with": "src/./environments/environment.prodpro.ts"
        }
      ]
    },

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

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
}

这是编译器错误吗?

1 个答案:

答案 0 :(得分:4)

来自docs

  

如果类具有主要构造函数,则每个次要构造函数都需要直接或间接通过另一个次要构造函数委派给主要构造函数。使用this关键字

可以委派给同一类的另一个构造函数

和:

  

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


您的Dog类具有一个主要的构造函数,因此您必须使用this来委托给它。 如果删除主要构造函数,则可以引用super构造函数:

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

上面没有出现错误