scala覆盖构建器中的val



我在以下代码中发现了一个奇怪的结果。

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)",这意味着seqf不同!为什么?

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即可。

最新更新