2010-10-26 37 views
6

Mi pregunta es acerca de las variables de tipo utilizadas en clases y métodos genéricos.Java Variables de tipo genérico

¿Por qué no podemos hacer algo como esto T = new T(); o en otras palabras, por qué no podemos construir un objeto de la variable de tipo?

sé que información genérica se borra durante la compilación, y todo se convierte en
objeto, así que por qué no asume el compilador que T es un objeto y nos vamos a la construimos?

+0

Esta es una buena pregunta. Ilustra algunos de los inconvenientes inherentes a los genéricos de Java y algunas filtraciones en la abstracción. Por cierto, tampoco puede crear una matriz 'T []' por la misma razón: escriba borrado. –

Respuesta

9

El problema es que en el tiempo de ejecución, la JVM no sabe qué clase representa realmente el T (esa información no se conserva en el tiempo de ejecución, eso es lo que significa "borrado de tipo"). Por lo tanto, la JVM acaba de ver que desea construir un nuevo T, pero no tiene idea qué constructor invocar en realidad, por lo tanto, no está permitido.

Existen soluciones provisionales, pero no funcionarán como usted propone.

¿por qué no asume el compilador que T es un objeto y dejar que nos construimos ??

Bueno, por supuesto, el tiempo de ejecución simplemente podría construir una instancia de java.lang.Object para usted, pero eso no sería de gran ayuda, ya que realmente quería un T.

+0

una cosa, ¿el motor de ejecución ve T u Objeto, no se borra la información genérica? –

+0

No sé qué ve el motor de ejecución, ya que no sé cómo se implementa internamente. Creo que simplemente no ve ningún tipo en absoluto. Probablemente pueda distinguir entre los casos en los que realmente hay "Objeto" escrito en el código y los casos en que se borró un tipo. – sleske

+1

Acaba de ver un 'Objeto'. –

2

Además de la respuesta de sleske; si necesita crear objetos de T dentro de su clase genérica, la solución es pasar una referencia Class<T> como argumento al constructor o al método que necesita para crear nuevos objetos y usar esa clase para crear instancias nuevas.

+1

o pase en una fábrica ? – Ishtar

+0

Sí, eso es lo que quise decir con "hay soluciones". Gracias por agregarlo :-). – sleske

+0

No apruebo este enfoque, pero si te gusta escribir un código realmente hacky, puedes evitarlo utilizando el reflejo. '((ParametrizedType) getClass()). GetActualTypeArguments() [0] .createNewInstance()'. Esto supone un constructor predeterminado, por supuesto. –

Cuestiones relacionadas