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

Nae*_*mul 6 overriding scala protected

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

假设trait T有一个受保护的def(或val).

trait T {
  protected def s: String
  def print(): Unit = println(s)
}
Run Code Online (Sandbox Code Playgroud)

我可以覆盖此方法def sval s.这里没有问题.

class A(override val s: String) extends T
Run Code Online (Sandbox Code Playgroud)

好.它汇编.但这是s公开的,因为没有受保护的关键字.

class B extends T {
  override protected val s: String = "Show me the money"
}
Run Code Online (Sandbox Code Playgroud)

好.它汇编.(sclass B保护)

class C(override protected val s: String) extends T
Run Code Online (Sandbox Code Playgroud)

好.它汇编.(sclass C保护)让我们做这些用case class.

case class D(override val s: String) extends T
Run Code Online (Sandbox Code Playgroud)

好.它汇编.(尽管sclass D是公共的)

case class E() extends T {
  override protected val s: String = "Show me the money"
}
Run Code Online (Sandbox Code Playgroud)

好.它汇编.(sclass E保护)

case class F(protected val s: String) extends T
Run Code Online (Sandbox Code Playgroud)

好.它汇编.(sclass F受到保护,并且也s被重写,因为它是不是在混凝土中trait T,这是抽象的,所以override关键词是没有必要的.)

case class G(override protected val s: String) extends T
Run Code Online (Sandbox Code Playgroud)

在这里,出现编译错误. error: value s$1 overrides nothing

基本上class Fclass G都是一样的.class F覆盖ss受到保护.这可以通过F("Something").print()确实打印来显示Something. override protected val可以在案例类中用作class E节目.它在定义普通类时没有出错C.

但是,仅class G在编译错误中定义结果.

为什么会发生这件事?

我正在使用Scala 2.10.3