Scala:“覆盖保护的val”在定义case类构造函数时导致错误

时间:2014-01-09 12:14:33

标签: scala override protected

我遇到了一些与案例类和override protected val相关的奇怪事情。

假设trait T有受保护的def(或val)。

trait T {
  protected def s: String
  def print(): Unit = println(s)
}

我可以使用def s覆盖此方法val s。没问题。

class A(override val s: String) extends T

行。它汇编。但这会使s公开,因为没有受保护的关键字。

class B extends T {
  override protected val s: String = "Show me the money"
}

行。它汇编。 (s的{​​{1}}受到保护)

class B

行。它汇编。 (class C(override protected val s: String) extends T 的{​​{1}}受到保护) 我们用s来完成这些。

class C

行。它汇编。 (虽然case class的{​​{1}}是公开的)

case class D(override val s: String) extends T

行。它汇编。 (s的{​​{1}}受到保护)

class D

行。它汇编。 (case class E() extends T { override protected val s: String = "Show me the money" } 的{​​{1}}受到保护,s也被覆盖,因为它在class E中并不具体。它是抽象的,因此case class F(protected val s: String) extends T 关键字不是必需的。)

s

此处出现编译错误。 class F

基本上,strait T是相同的。 override覆盖case class G(override protected val s: String) extends T error: value s$1 overrides nothing受到保护。这可以通过class F确实打印class G来显示。 class F可以在s显示的案例类中使用。它在定义普通类s时没有出错。

但是,仅定义F("Something").print()会导致编译错误。

为什么会发生这件事?

我正在使用Scala 2.10.3

1 个答案:

答案 0 :(得分:1)

此错误将在Scala 2.11.0-M8

中修复

https://issues.scala-lang.org/browse/SI-8132