2010-06-07 12 views
19

Hay un montón de preguntas sobre stackoverflow de personas que han tratado de crear una matriz de genéricos, así:¿Por qué Java no permite la creación de matrices genéricas?

ArrayList<Foo>[] poo = new ArrayList<Foo>[5]; 

Y la respuesta es, por supuesto, que la especificación Java no le permiten declarar una matriz de genéricos.

Mi pregunta sin embargo es ¿por qué? ¿Cuál es la razón técnica que subyace a esta restricción en el lenguaje java o java vm? Es una curiosidad técnica que siempre me he preguntado.

Respuesta

13

Las matrices se reifican, retienen información de tipo en tiempo de ejecución.

Los genéricos son una construcción en tiempo de compilación: la información del tipo se pierde durante el tiempo de ejecución. Esta fue una decisión deliberada para permitir la compatibilidad con el bytecode Java pregenérico. La consecuencia es que no puede crear una matriz de tipo genérico porque, para cuando la VM desea crear la matriz, no sabrá qué tipo usar.

3

Aquí es una vieja entrada de blog que escribí donde explico el problema: Java generics quirks

Ver How do I generically create objects and arrays? a partir de Angelika Langer Java Genéricos Preguntas para una solución (que puede hacerlo utilizando la reflexión). Esa pregunta frecuente contiene todo lo que siempre quieres saber sobre los genéricos de Java.

+0

La página del blog fue organizada por mi ex empleador y ya no existe. – Jesper

0

que se ven obligados a utilizar

ArrayList<Foo>[] poo = new ArrayList[5]; 

el cual le dará una advertencia sin marcar. La razón es que existe un problema potencial de seguridad de tipo con los genéricos y el comportamiento de comprobación de tipos en tiempo de ejecución de las matrices de Java, y quieren asegurarse de que lo saben al programar. Cuando escribe new ArrayList[...], está creando algo que verificará, en tiempo de ejecución, todo lo que se pone en él para asegurarse de que sea una instancia de ArrayList. Siguiendo este esquema, al hacer new ArrayList<Foo>[...], esperas crear algo que verifique en tiempo de ejecución todo lo que se pone en él para asegurarte de que sea una instancia de ArrayList<Foo>. Pero esto es imposible de hacer en tiempo de ejecución, porque no hay información de genéricos en tiempo de ejecución.

Cuestiones relacionadas