我在以下代码中发现了一个奇怪的结果。
object Practice {
class A(val seq: Seq[Int]){
println(f, seq)
def f: Seq[Int] = seq
}
class B(override val seq: collection.mutable.WrappedArray[Int]) extends A(null)
def main(args: Array[String]): Unit = {
new B(Array(3,4,2))
}
}
打印结果是"(3、4、2),null)",这意味着seq
和f
不同!为什么?
Scala类的"正文"实际上是Java中构造函数的主体。类似public A(seq: Seq) { this.seq = seq; prinltn(f(), seq); }
这是在B构造期间,调用A(null)
并打印参数的值时执行的,即null
。参数阴影成员。
尝试将A
的定义更改为这样的东西:
class A(_seq: Seq[Int]){
println(f, seq)
val seq: Seq[Int] = _seq
def f: Seq[Int] = seq
}
现在,new B(...)
将打印两个相同的值。
远离这是 - 不要覆盖阀。这几乎从来没有必要,而且您可以看到,可能比看起来更棘手。
如果val
是一个超级类参数,则在构造子类而不是覆盖时,您始终只能传递正确的值。如果不是参数,只需将其作为超类中的def
即可。