2014-01-09 5 views
5

케이스 클래스와 관련된 이상한 점이 발생했습니다. override protected val.스칼라 : case 클래스 생성자를 정의 할 때 "protected val"을 오버라이드합니다.

trait Tdef (또는 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를 (sclass B는 보호된다). 컴파일됩니다. (sclass C 인 경우) case class으로 해보 죠.

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

확인을 클릭합니다. 컴파일됩니다. (sclass 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 Es는 보호된다). 컴파일됩니다. (class Fs 보호되며,이 trait T 콘크리트가 아니었다으로도 s는 오버라이드 (override)됩니다. 그것은 추상적 인, 그래서 override 키워드가 필요하지 않습니다.)

case class G(override protected val s: String) extends T 

여기서 오류가 나타납니다 컴파일합니다. error: value s$1 overrides nothing

기본적으로 class Fclass G은 같습니다. class F 덮어 쓰기 ss이 보호됩니다. 이것은 F("Something").print()이 실제로 표시 할 수 있음을 나타냅니다. Something입니다. override protected val은 사례 클래스에서 class E과 같이 사용할 수 있습니다. 보통 클래스 C을 정의하는 데 오류가 발생하지 않았습니다.

그러나 class G 만 정의하면 컴파일 오류가 발생합니다.

왜 이런 일이 발생합니까?

저는 스칼라 2.10을 사용하고 있습니다.3

+0

고정한다하는 버그가있는 것 같다. [여기] (https://issues.scala-lang.org/)에 신고하십시오. – sschaef

+0

@sschaef OK. 내가보고 할게. – Naetmul

+1

definitly 버그. 's'가 보호되어 있기 때문에, scala는'G'의 companion 객체가 그것에 접근 할 수 있도록's'를 반환하는 별도의 syntetic' defs $ 1' public 메소드를 생성합니다. 's $ 1'이 아무것도 무시하지 않더라도 둘 다'override'라고 표시됩니다. – gourlaysama

답변