2012-08-16 2 views
17

관련 종류의 튜플 패턴 일치 : 다음스칼라 - I는 다음의 클래스 계층이

class A 
class B extends A 
class C extends A 

를,이 클래스의 인스턴스를 취하고있어서가 다른 클래스 존재하는 두 가지 경우 중 패턴 매칭은 다음과 같이 할 수 있습니다 : 그것은 두 번째 경우 (B, C)에 찬성 일치를 해결해야 할 때

class D (one: A, two: A) { 

    def work { 
    (one, two) match { 
     case (o, t): (B, B) => ... blablabla 
     case (o, t): (B, C) => ... blablabla 
     case _ => 
    } 
    } 
} 

그러나, 그것은 (B, B)로 해결하고 C cannot be cast to B 그 클래스 캐스트 예외와 함께 제공하려고합니다. 왜? 무엇을해야합니까? 이 문제를 어떻게 해결할 수 있습니까?

답변

26

구문이 올바르지 않습니다 (컴파일하지 않음).

하지만 이것은 작동 : 언제나처럼, 유형을 지워집니다

object Matcher extends App { 

    class A 
    class B extends A 
    class C extends A 

    class D(one: A, two: A) { 

    def work { 
     (one, two) match { 
     case (o: B, t: B) => println("B") 
     case (o: B, t: C) => println("C") 
     case _ => 
     } 
    } 
    } 

    val d1 = new D(new B, new B) 
    val d2 = new D(new B, new C) 

    d1.work 
    //B 
    d2.work 
    //C 
} 
+0

나는 정확한 구문을 알아 내기 위해 너무 오랫동안 고심 해왔다 ... 고마워! – Benoit

2

이 코드를 만들었습니다.
먼저 클래스 정의에 사례를 추가했습니다.

case class A 
case class B extends A 
case class C extends A 

두 번째로 work을 변경했습니다.

class D(one: A, two: A) { 
    def work { 
    (one, two) match { 
     case (o: B, t: B) => println("BB") 
     case (o: B, t: C) => println("BC") 
     case (o: C, t: C) => println("CC") 
     case _ => println("AA") 
    } 
    } 
} 

내가 가진 지금 무엇을 :

new D(B(),B()).work  => BB 
new D(B(),C()).work  => BC 
new D(C(),C()).work  => CC 
new D(A(),B()).work  => AA 
case가 적용 추가

과 적용을 취소하는 방법.

+0

그래, 케이스 클래스 ...하지만 그들은 상속과 버그가 ... 나는 언젠가는 그 문제를 해결하면 매우 행복 할 것입니다 ... – noncom

+0

나는 completly 당신과 함께입니다. –

+1

이 코드는 현대 스칼라에서 컴파일되지 않습니다. 왜냐하면 케이스 상속은 2.9부터 금지되어 있기 때문입니다. @noncom 이것은 버그가 아니므로 설계된 것입니다 –

7

문제. (B,C)Tuple2[B,C]에 대한 구문 설탕이며 런타임에 Tuple2으로 지워집니다. case 문은 (B,C)Tuple2과 일치하지만 캐스팅하지 못했습니다.

one match { 
    case o : B => two match { 
    case p : C => ... 
    case p : B => ... 
    } 
    ... 
} 

그것은하지 너무 귀엽다하지만하지 않습니다 :

귀하의 경우

, 가장 쉬운 해결책은 오히려 튜플에 그들을 배치보다 개별적으로 '하나'와 '둘'에 대해 일치하는 것 동일한 문제로 고통받습니다.

편집 : 사실, 나는 브라이언 스미스 (Brian Smith)의 해결책을 생각해 보았다. 비슷한 방식으로 문제를 피할 수 있지만 더 멋지게 보입니다.

관련 문제