Kotlin:不允许在辅助构造函数参数上使用'val'

时间:2018-01-05 11:19:02

标签: constructor kotlin

我有以下课程:

class Person(val name: String) {
    private var surname: String = "Unknown"

    constructor(name: String, surname: String) : this(name) {
        this.surname = surname
    }
}

但是当我想在第二个构造函数中使 name 参数不可变时:

constructor(val name: String, surname: String) : this(name) {
    this.surname = surname
}

我有以下编译时错误:

  

Kotlin:不允许在辅助构造函数参数上使用'val'

有人可以解释为什么Kotlin编译器不允许这样做吗?

2 个答案:

答案 0 :(得分:21)

Kotlin中的参数总是不可变的。将构造函数参数标记为val会将其转换为类的属性,这只能在主构造函数中完成,因为类的属性集不能根据用于创建实例的构造函数而变化该课程。

答案 1 :(得分:3)

yole的优秀答案外,documentation也非常明确:

  

请注意,主构造函数的参数可以在初始化程序块中使用。它们也可以在类体中声明的属性初始值设定项中使用。   [...]事实上,为了声明属性并从主构造函数初始化它们,Kotlin有一个简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}
  

与常规属性大致相同,主构造函数中声明的属性可以是可变的(var)或只读的(val)。

这一切都不适用于辅助构造函数。