我在以下代码中发现了一个奇怪的结果。
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))
}
}
打印结果为"(WrappedArray(3,4,2),null)",表示seq
和f
不同!为什么?
答案 0 :(得分:2)
scala类的“body”实际上是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(...)
将打印两个相同的值。
从中获取的是 - 不要覆盖vals。它几乎从来没有必要,而且,正如你所看到的,可能比它看起来更棘手。
如果val
是超类参数,则在构造子类时可以始终只传递正确的值而不是覆盖。如果它不是参数,只需在超类中将其设为def
即可。