我遇到了一些与案例类和 override protected val
相关的奇怪事情。 .
比方说 trait T
有一个 protected 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
public 因为没有 protected 关键字。class B extends T {
override protected val s: String = "Show me the money"
}
好的。它编译。 (
s
的 class B
受到保护)class C(override protected val s: String) extends T
好的。它编译。 (
s
的 class C
受到保护)让我们用
case class
来做这些.case class D(override val s: String) extends T
好的。它编译。 (虽然
s
的 class D
是公开的)case class E() extends T {
override protected val s: String = "Show me the money"
}
好的。它编译。 (
s
的 class E
受到保护)case class F(protected val s: String) extends T
好的。它编译。 (
s
的 class F
受到保护,而且 s
被覆盖,因为它在 trait 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()
来证明确实会打印Something
.override protected val
可以在案例类中使用 class E
显示。它在定义普通类时没有出错C
.但是,仅定义
class G
导致编译错误。为什么会发生这样的事情?
我正在使用 Scala 2.10.3
最佳答案
此错误将在 Scala 2.11.0-M8
中修复
https://issues.scala-lang.org/browse/SI-8132
关于Scala: "override protected val"在定义案例类构造函数时导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21019966/