케이스 클래스와 관련된 이상한 점이 발생했습니다. override protected val
.스칼라 : case 클래스 생성자를 정의 할 때 "protected val"을 오버라이드합니다.
trait T
이 def
(또는 val
)으로 보호되어 있다고 가정 해 보겠습니다.
trait T {
protected def s: String
def print(): Unit = println(s)
}
나는 val s
이 메소드 def s
을 대체 할 수 있습니다. 문제 없다.
class A(override val s: String) extends T
확인을 클릭합니다. 컴파일됩니다. 그러나 이것은 보호 된 키워드가 없으므로 s
을 공개합니다.
class B extends T {
override protected val s: String = "Show me the money"
}
확인을 클릭합니다. 컴파일됩니다.
class C(override protected val s: String) extends T
OK를 (s
의 class B
는 보호된다). 컴파일됩니다. (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"
}
OK. 컴파일됩니다.
case class F(protected val s: String) extends T
OK를 (class E
의 s
는 보호된다). 컴파일됩니다. (class F
의 s
보호되며,이 trait T
콘크리트가 아니었다으로도 s
는 오버라이드 (override)됩니다. 그것은 추상적 인, 그래서 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
만 정의하면 컴파일 오류가 발생합니다.
왜 이런 일이 발생합니까?
저는 스칼라 2.10을 사용하고 있습니다.3
고정한다하는 버그가있는 것 같다. [여기] (https://issues.scala-lang.org/)에 신고하십시오. – sschaef
@sschaef OK. 내가보고 할게. – Naetmul
definitly 버그. 's'가 보호되어 있기 때문에, scala는'G'의 companion 객체가 그것에 접근 할 수 있도록's'를 반환하는 별도의 syntetic' defs $ 1' public 메소드를 생성합니다. 's $ 1'이 아무것도 무시하지 않더라도 둘 다'override'라고 표시됩니다. –
gourlaysama