Kotlin:二级构造函数参数中的“val”是不允许的
我有以下课程:
class Person(val name: String) { private var surname: String = "Unknown" constructor(name: String, surname: String) : this(name) { this.surname = surname } }
但是,当我想要在第二个构造函数中具有不变的名称参数时:
constructor(val name: String, surname: String) : this(name) { this.surname = surname }
我有以下编译时错误:
Kotlin:二级构造函数参数中的“val”是不允许的
有人可以解释为什么Kotlin编译器不允许这样做?
Kotlin中的参数总是不变的。 将构造函数参数标记为val
会将其变成类的属性,并且这只能在主构造函数中完成,因为根据用于创建类实例的构造函数,类的属性集不能改变。
除了yole的很好的答案之外 , 文档也很清楚:
请注意, 主构造函数的参数可以在初始化块中使用。 它们也可以用在类体中声明的属性初始值设定项中。 […]实际上,为了从主构造函数声明属性并初始化它们,Kotlin有一个简洁的语法:
class Person(val firstName: String, val lastName: String, var age: Int) { // ... }
与常规属性大致相同,在主构造函数中声明的属性可以是可变的(var)或只读的(val)。
这一切都不适用于二级构造函数。