【问题标题】:Scala override val in constructorScala 在构造函数中覆盖 val
【发布时间】:2018-03-15 07:15:41
【问题描述】:

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

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不一样!为什么?

【问题讨论】:

    标签: scala constructor overriding


    【解决方案1】:

    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(...) 将打印两个相同的值。

    从中得出的结论是 - 不要覆盖 vals。它几乎从来没有必要,而且,正如你所看到的,它可能比看起来更棘手。

    如果val 是超类参数,则在构造子类时始终可以只传递正确的值而不是覆盖。如果它不是参数,只需在超类中将其设为def

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多