2011-09-22 12 views
9

Estoy tratando de usar la coincidencia de patrones Scala en Java Class [_] (en el contexto del uso de la reflexión de Java desde Scala) pero estoy recibiendo un error inesperado. A continuación se presenta "código inalcanzable" en la línea con caso jLong¿Coincidencia de patrón en clase [_]?

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") 
    } 
} 

Cualquier idea por qué está sucediendo esto?

Respuesta

15

El código funciona como se espera si cambia los nombres de las variables en mayúsculas (o rodearlos con acentos abiertos en el patrón):

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 

En el código de la jInteger en el primer patrón es una nueva variable no es el jInteger del alcance circundante. Desde el specification:

8.1.1 patrones variables

... Un patrón variable x es un identificador simple que comienza con una letra minúscula. Es coincide con cualquier valor y vincula el nombre de la variable a ese valor.

...

8.1.5 Patrones Identifier estables

... Para resolver el solapamiento sintáctica con un patrón variable, un patrón identificador estable puede no ser un simple nombre a partir de una letra minúscula . Sin embargo, es posible incluir un nombre de variable de ese tipo en comillas inversas; luego se trata como un patrón de identificador estable.

Consulte this question para obtener más información.

+1

acentos abiertos es una solución mejor que la mía :) – JaimeJorge

+0

impresionante! Muchas gracias, Travis. – alphageek

7

En su coincidencia de patrón, cada uno de estos 2 casos intenta crear nombres de marcador de posición en lugar de coincidir con el tipo de clase como se esperaba.

Si utiliza mayúsculas en el carácter de partida, se le multa

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 
Cuestiones relacionadas