2011-03-07 8 views
9

Tenga una mirada en esta clase Scala:¿Por qué esta advertencia de borrado con variables miembro declarada como una tupla?

class Example { 
    val (x, y): (Int, Int) = (1, 2) 
} 

Compilación esto da lugar a una advertencia:

Example.scala:2: warning: non variable type-argument Int in type pattern 
       (Int, Int) is unchecked since it is eliminated by erasure 
    val (x, y): (Int, Int) = (1, 2) 
       ^

Extracción del tipo de anotación explícita se deshace de esta advertencia:

class Example { 
    val (x, y) = (1, 2) 
} 

Por qué ¿recibo la advertencia y por qué la eliminación de la anotación de tipo explícito se deshace de ella? Por lo que puedo ver, nada realmente cambia, x y y son todavía del tipo Int sin la anotación de tipo.

Respuesta

13

Se puede reescribir su ejemplo a:

class Example { 
    val Tuple2(x, y): Tuple2[Int, Int] = Tuple2(1, 2) 
} 

Esta coincidencia de patrón consta en realidad de 2 partidos - que ahora dice: toma el objeto lado derecho de tipo Tuple2[Int, Int] y llame al método unapply[Int, Int] en el objeto Tuple2 compañero . El unapply[Int, Int] verificará que el objeto realmente tenga el tipo Tuple2, y su valor de resultado se usará para enlazar valores a las variables x y y.

Después de eso, esta coincidencia de patrón contiene : Tuple2[Int, Int], por lo que intenta hacer una comprobación isInstanceOf[Tuple2[Int, Int]] de forma dinámica para ver si el objeto también tiene el tipo Tuple2[Int, Int]. Sin embargo, la información de tipo genérico se borra en tiempo de ejecución, por lo que el compilador advierte que no puede producir código que verifique que el objeto se instancia para los parámetros de tipo [Int, Int].

De la misma manera, en el partido siguiente patrón:

val a: AnyRef = (1, 2) 
a match { 
    case t2: Tuple[Int, Int] => 
} 

que se obtendría una advertencia similar.

+0

Ok, si omito la anotación tipo, en la segunda coincidencia intenta hacer coincidir 'Tuple2 [_, _]' en lugar de 'Tuple2 [Int, Int]' y no necesita verificar el borrado tipo de parámetros Por lo tanto, es un desafortunado efecto secundario de la sintaxis especial para las tuplas. – Jesper

5

creo que la respuesta corta a tu pregunta es:

class Example { 
    val (x: Int, y: Int) = (1, 2) 
} 

porque (Int, Int) es no un tipo, mientras que (x: Int, y: Int) es una expresión de patrón válida.

+0

Gracias, esa es una solución útil. – Jesper

Cuestiones relacionadas