【问题标题】:Kotlin: 'val' on secondary constructor parameter is not allowedKotlin:不允许在辅助构造函数参数上使用“val”
【发布时间】:2018-01-05 11:19:02
【问题描述】:

我有以下课程:

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

【问题讨论】:

  • name 是不可变引用,因为它在主构造函数中声明为 val
  • kotlin 函数和构造函数中的所有参数都是不可变的,即fun foo(name : String) 转换为java public void foo(@NotNull final String name)

标签: constructor kotlin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    除了yole的精彩回答,documentation也很清楚:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多