Scala会针对以下代码抛出“重新分配给val”错误。
abstract case class Gun(var bulletCount:Int)
class Pistol(bulletCount:Int) extends Gun(bulletCount){
def fire() { bulletCount=bulletCount-1 }
}
我在这里错过了什么?
答案 0 :(得分:3)
对于初学者,您应该将case class
视为最终版,而不是扩展它们。
其次,不要将var
与case class
一起使用,您应该创建case class
的副本以更改其中一个字段。
第三,如果你想要一个普通类型,你可以使用一个基本特征。
一体化,这就是它的样子:
sealed trait Gun {
def bulletCount: Int
}
case class Pistol(bulletCount: Int) extends Gun {
def fire(): Pistol = copy(bulletCount=bulletCount)
}
答案 1 :(得分:0)
您指的是bulletCount
主构造函数参数生成的Pistol
字段。要设置基类变量,您需要使用super
:
class Pistol(bulletCount: Int) extends Gun(bulletCount) {
def fire(): Unit = {
super.bulletCount = super.bulletCount - 1
}
}
或者,您可以使用override var
标记参数生成的字段:
class Pistol(override var bulletCount: Int) extends Gun(bulletCount) {
def fire(): Unit = {
bulletCount = bulletCount - 1
}
}
另一方面,正如Frederic A.在答案中建议的那样,你应该避免继承案例类。它们是语法糖,代码生成不会继承 - 你需要自己在伴侣类中实现所有花哨的东西,如apply
或unapply
方法。 Scala编译器团队试图支持case类到case类的继承,但发现它破坏了结构相等性和许多其他东西。