当前位置: 首页 > 知识库问答 >
问题:

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

夏景同
2023-03-14

我有以下课程:

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个答案

钱华晖
2023-03-14

除了yole的绝妙答案外,文档也非常清晰:

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

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

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

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

微生啸
2023-03-14

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

 类似资料:
  • 我有以下代码: 我不希望字段ui有一个getter,但是kotlin在默认情况下会生成它,因为它是构造函数中定义的val。 在properties and fields文档中,我发现我可以用以下代码生成一个私有getter 但我在构造函数定义中找不到这样做的方法

  • 最近,我开始学习,并琢磨出函数可能是这样没有参数编写的: 这是怎么可能的,以及在引擎盖下正在做什么?不允许我们这样做。

  • 问题内容: 我正在尝试为我的NodeJS项目构建一组实用程序。这些帮助程序包括:文本实用程序(如子字符串,控制台日志记录等),以及更具体的帮助程序,如分析tweet的文本。 因此,我试图将模块划分为不同的文件,并对每件事的含义非常清楚。 例如,我想实现以下目标: 如您所见,我通过调用非常特定的方法和子方法将Utils用于不同的事情。 我试图了解继承在这里的工作原理,但我有点迷失了。 这就是我正在做

  • 我使用MDN文档中描述的Set对象的构造函数编写了一些代码。不幸的是,Internet Explorer 11忽略构造函数中的任何iterable参数。我曾快速尝试过重写构造函数(下面的代码),但没有成功(Set.prototype.size返回-‘this’不是Set对象)。 有没有一种方法允许Set构造函数传递一个可迭代的参数,并且仍然在即. e.中工作?我想下一个最好的选择是创建某种工厂方法

  • 简介 Laravel 包含各种各样的全局「辅助」PHP 函数,框架本身也大量地使用了这些功能;如果你觉得方便,你可以在你的应用中自由的使用它们。 可用方法 数组 & 对象 array_add array_collapse array_divide array_dot array_except array_first array_flatten array_forget array_get arra

  • 列标字符转化 获取扩展版本 查看作者信息