2011-09-22 3 views
9

(스칼라에서 자바 리플렉션을 사용하는 맥락에서) 자바 클래스 [_]에서 스칼라 패턴 매칭을 사용하려하지만 예기치 않은 오류가 발생했습니다. 이런 일이 왜 다음은 경우 jlong를클래스 [_] 유형의 패턴 일치?

def foo[T](paramType: Class[_]): Unit = { 
    val jInteger = classOf[java.lang.Integer] 
    val jLong = classOf[java.lang.Long] 
    paramType match { 
    case jInteger => println("int") 
    case jLong => println("long") 
    } 
} 

어떤 아이디어가있는 라인의 "도달 할 수없는 코드를"제공? 코드에서

scala> def foo[T](paramType: Class[_]): Unit = { 
    | val jInteger = classOf[java.lang.Integer] 
    | val jLong = classOf[java.lang.Long] 
    | paramType match { 
    |  case `jInteger` => println("int") 
    |  case `jLong` => println("long") 
    | } 
    | } 
foo: [T](paramType: Class[_])Unit 

scala> foo(classOf[java.lang.Integer]) 
int 

첫 번째 패턴의 jInteger 새로운 가변이다 :

답변

15

코드는 대문자 변수 이름을 변경 (또는 패턴에 역 따옴표와 함께 그들을 둘러싸고있는) 경우 예상대로 작동 주변 범위의 jInteger이 아닙니다. specification에서 :

8.1.1 가변 패턴

... 가변 패턴 X는 소문자로 시작하는 간단한 식별자이다. 은 모든 값과 일치하며 변수 이름을 해당 값에 바인딩합니다.

...

8.1.5 안정 식별자 패턴

... 가변 패턴 구문 오버랩를 해결하려면, 안정된 식별자 패턴을 시작하는 간단한 이름이 아닌 소문자 문자. 그러나 이러한 변수 이름을 역 따옴표로 묶을 수도 있습니다. 안정된 식별자 패턴으로 취급됩니다.

자세한 내용은 this question을 참조하십시오.

+1

역 따옴표 괜찮을거야 것은 나보다 더 나은 솔루션입니다 : 최고 – JaimeJorge

+0

! 많은 고마워, 트래비스. – alphageek

7

패턴 일치에서이 두 가지 경우 각각 클래스 유형을 예상대로 일치시키는 대신 자리 표시 자 이름을 만들려고합니다. 당신이 시작 문자에 대문자를 사용하는 경우

, 당신은

def foo[T](paramType: Class[_]): Unit = { 
    val JInteger = classOf[Int] 
    val JLong = classOf[Long] 
    paramType match { 
    case JInteger => println("int") 
    case JLong => println("long") 
    } 
} 

scala> foo(1.getClass) 
int