2012-07-10 4 views
3

알 수없는 유형의 두 변수가 있습니다. 변수 유형의 조합에 대해 패턴 일치를 수행하고이를 기반으로 조치를 취하고 싶습니다. 특히 Comparator[Any]을 구현하고 유형에 따라 두 변수를 비교하고 싶습니다.두 개의 바인드 변수 유형에 대한 스칼라 패턴 일치

class SomethingComparator extends util.Comparator[Any] { 
    override def compare(o1: Any, o2: Any) = List(o1, o2).map(_.isInstanceOf[Something]) match { 
    case List(true, true) => o1.asInstanceOf[Something].someInt.compareTo(o2.asInstanceOf[Something].someInt) 
    case List(true, false) => -1 
    case List(false, true) => 1 
    case _ => 0 
    } 
} 

직접 유형에 map 전화 및 패턴 일치를 피하기, 따라서 첫 경기에서 두 asInstanceOf 전화를 피하는 방법이 있나요 :이 코드는 원하는 결과를 생산?

답변

5

이 작동 : 두 번째와 세 번째 'case`s가 동일하기 때문에

class SomethingComparator extends util.Comparator[Any] { 
    override def compare(o1: Any, o2: Any) = (o1, o2) match { 
    case (o1:Something, o2:Something) => o1.someInt.compareTo(o2.someInt) 
    case (o1:Something, o2:Any) => -1 
    case (o1:Any, o2:Something) => 1 
    case _ => 0 
    } 
} 
+0

당신은 "도달 할 수없는 코드"오류가 발생했다. 'case '의'o1'과'o2'는 일치에 의해 구속되므로 오래된'o1'과'o2'와는 다른 새로운 변수로 취급됩니다. – dhg

+0

Thx, 그냥 알아 냈어 :) – Raman