Kotlin:不允许在辅助构造函数参数上使用“瓦尔”

hgc7kmma  于 2022-12-19  发布在  Kotlin
关注(0)|答案(4)|浏览(154)

我有以下类:

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编译器不允许这样做吗?

uqzxnwby

uqzxnwby1#

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

izj3ouym

izj3ouym2#

除了yole的出色回答之外,documentation也非常明确:
注意,主构造函数的参数可以用在初始化器块中,也可以用在类体中声明的属性初始化器中。[......]事实上,对于从主构造函数声明属性并初始化它们,Kotlin有一个简洁的语法:

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

与常规属性非常相似,在主构造函数中声明的属性可以是可变的(var)或只读的(瓦尔)。
这些都不适用于次要构造函数。

0yycz8jy

0yycz8jy3#

可以在继承自的类中将变量定义为瓦尔或var

open class Human(val name: String) constructor(name: String) {
            open fun showInfo()
        {
            println("Show Info")
        }
        }

class Person:Human {

constructor(name: String) : super(name)
    private var surname: String = "Unknown"
  override fun showInfo() {
        println("$name And surname is $surname")
    }
    
}
c0vxltue

c0vxltue4#

目前公认的答案正确地解释了为什么你最初的尝试没有成功。因此,考虑到你的特定场景,我将逆解,使你的次要构造函数成为主要构造函数,并使第二个参数具有默认值。

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

此外,如果类的目的只是保存数据,我会将其设置为data class以改进其处理。

相关问题