Scala在构造函数中覆盖val

时间:2017-10-04 01:16:24

标签: scala constructor override

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

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)",表示seqf不同!为什么?

1 个答案:

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