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)。

这一切都不适用于二级构造函数。