9
scala> class A 
defined class A 

scala> class B 
defined class B 

scala> val a: A = new A 
a: A = [email protected] 

scala> a match { 
    | case _: B => println("unlikely") 
    | case _ => println("no match") 
    | } 
no match 

위 예제에서 컴파일러는 하나의 사례가 결코 일치 할 수 없다고 말하지 않아야합니까? 약간 더 복잡한 예가 최근에 나를 잡아 냈습니다. 컴파일러에 의해 잡혀 야하는 불필요한 버그 같은 느낌을 받았습니다.스칼라에서 일치하는 형식에 대한 더 나은 검사

편집 :

그냥 질문에 대한 명확합니다. 내가 볼 수없는 몇 가지 이유로 스칼라에서는 불가능한 일일까요? (유형이 제네릭을 사용하고 유형 삭제가 문제를 일으키는 지 이해할 수 있지만 이것은 매우 직설적입니다.) 이것이 불가능하지 않으면 이것이 스칼라에없는 합법적 인 이유가 있습니까? 그렇지 않은 경우 언제 추가됩니까? ;)

답변

22

현재, 포괄 성 및 이중화는 경우 클래스 생성자 패턴을 완료 확인. 원칙적으로 컴파일러는 다른 종류의 패턴에 대해서도 이것을 할 수 있습니다. 그러나 SLS에서 정확히 어떤 테스트가 수행되었는지 명시해야합니다. 서로 다른 패턴 클래스 간의 상호 작용을 고려할 때 이것은 가능하지만 단순하지 않은 것처럼 보입니다. 요약하자면 추가 기여로 이익을 얻을 수있는 스칼라 영역 중 하나입니다.

+3

놀라워요! 나는 스카우트를 가르쳐 준 사람으로부터 내 대답을 찾아 내야한다. Thx stackoverflow! – Kami

4

컴파일러는 당신이 경우 클래스를 사용하는 경우 (사실 컴파일에) 실패 경고를 수행합니다

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> val a = A() 
a: A = A() 

scala> a match { 
    | case A() => println("A") 
    | case B() => println("B") 
    | case _ => println("_") 
    | } 
<console>:13: error: constructor cannot be instantiated to expected type; 
found : B 
required: A 
     case B() => println("B") 
+0

불행히도 사례 클래스에는 몇 가지 제한이 있으며 항상 적합한 것은 아닙니다. 나는 컴파일러가 일반 클래스에 대해서도 이것을 이해할 수없는 이유를 알 수 없다. – Dave