Scala编译器错误,因为构造函数参数(属性)在基类和派生类中具有相同的名称,并在派生方法中使用

Scala编译器错误,因为构造函数参数(属性)在基类和派生类中具有相同的名称,并在派生方法中使用,scala,constructor,Scala,Constructor,除了重命名类B的主构造函数中的构造函数参数外,我可以对以下代码进行哪些更改(不更改其函数),以便Scala成功编译它 例如: class A(var a: Int) class B(a: Int) extends A(a) { def inc(value: Int) { this.a += value } } 错误: $ scala construct.scala construct.scala:3: error: reassignment to val def inc(value:

除了重命名类
B
的主构造函数中的构造函数参数外,我可以对以下代码进行哪些更改(不更改其函数),以便Scala成功编译它

例如:

class A(var a: Int)
class B(a: Int) extends A(a) {
  def inc(value: Int) { this.a += value }
}
错误:

$ scala construct.scala
construct.scala:3: error: reassignment to val
  def inc(value: Int) { this.a += value }
                               ^
one error found
我在对上一个问题的回答中提出了这个问题。

另一种选择:

class A(var a: Int)
class B(a: Int) extends A(a) {
  self: A => 
  def inc(value: Int) { self.a += value }
}

对于更广泛的情况,这可能会更好,因为您可以在整个函数体中使用
self
(或您选择的任何其他名称)。

Nice!类型转换
(this:A)
对我来说是新的!我也是。丹尼尔·索布拉尔最近向我介绍了它。请注意,这是一种类型安全的向上转换,与(this.asInstanceOf[a]).a不同,后者也会编译.Cool。现在我进一步了解了()。注意:
(this:a)
在技术上被称为“类型归属”(typeascription)。这可以编译,但不正确。val x=新的B(1);x、 公司(5);println(x.a)/==1Daniel,我猜你弄错了一点:你在
inc
中创建了一个匿名函数(a)=>Unit,并且不返回它,因为inc的返回类型是Unit。所以没有增量发生。显然,
self:A=>
应该在B类的开头括号之后。你们都是对的,我错了。我已将
self:A=>
语句移动到正确的位置。
class A(var a: Int)
class B(a: Int) extends A(a) {
  self: A => 
  def inc(value: Int) { self.a += value }
}