首页 > 解决方案 > Scala:“重新分配给 val”x,但 x 是 var

问题描述

我有以下一段代码

class A(var x: Int, var y: Int){

}

class B(x: Int, y: Int) extends A(x,y){

    def setX(xx: Int): this.type = {
        this.x = xx
        this
    }
}

但它给出了以下错误:

error: reassignment to val this.x = xx ^

我不知道发生了什么,因为 x 和 y 应该是变量。这样做的正确方法是什么?

标签: scalavar

解决方案


成员变量的名称与构造函数参数的名称存在冲突。

显而易见的解决方法编译得很好:

class A(var x: Int, var y: Int)

class B(cx: Int, cy: Int) extends A(cx, cy) {

    def setX(xx: Int): this.type = {
        this.x = xx
        this
    }
}

这个问题似乎不是新问题,这里是2009 年论坛条目的链接。在相同的情况下,它有一个带有字面上相同的错误消息的帖子

根本原因是构造函数参数可以自动转换为private val,因为可以从对象的方法中引用它们:

class B(cx: Int, cy: Int) {
  def foo: Int = cx
}

推荐阅读