2009-09-25 20 views

Respuesta

5

Los genéricos de Java son tratados por el compilador de Java y se convierten a una versión no genérica en tiempo de compilación. Esto es diferente de .NET donde el CLR tiene soporte de primera clase para los parámetros de tipo. En el nivel de código de bytes, ArrayList<T> será un simple ArrayList.

Para citar Java docs:

Generics se implementan por el compilador de Java como una conversión de extremo frontal llamado borrado, que es el proceso de traducción o reescritura de código que utiliza genéricos en código no genérico (es decir, mapea la nueva sintaxis a la especificación JVM actual). En otras palabras, esta conversión borra toda la información de tipo genérico; toda la información entre corchetes angulares se borra. Por ejemplo, LinkedList<Integer> se convertirá en LinkedList. Los usos de otras variables de tipo se reemplazan por el límite superior de la variable de tipo (por ejemplo, Object), y cuando el código resultante no es de tipo correcto, se inserta una conversión al tipo apropiado.

+4

No me gustan los genéricos de Java por este motivo. Los genéricos deberían haber sido una característica importante, pero en su lugar no era mucho más que azúcar sintáctica para evitar lanzar objetos a un tipo específico. El azúcar es maravilloso, pero podría haber sido mucho más. Mumble tipos y realmente agregan valor, así que no es del todo malo. – Joren

+1

@Joren, estás siendo innecesariamente duro con los genéricos. Mientras que la borradura de tipo es ciertamente decepcionante, los genéricos son ciertamente un claro paso adelante para tener que lanzar desde Object ya que ahora podemos tener todas las garantías de tiempo de compilación del sistema de tipo Java con nuestras clases genéricas. – Falaina

+3

Pero la información genérica todavía está disponible en el archivo de clase compilado como metadatos (de lo contrario 'javac' no podría verificar los genéricos). ¿No podría IKVM usar esta información? –

Cuestiones relacionadas