Esto surgió como una pregunta que hice en una entrevista recientemente como algo que el candidato deseaba que se agregara al lenguaje Java. Es comúnmente identificado como una molestia que Java no tenga genéricos reificados pero, cuando se le presionó, el candidato no pudo decirme el tipo de cosas que podría haber logrado si estuvieran allí.
Obviamente, debido a que los tipos sin procesar están permitidos en Java (y las comprobaciones inseguras), es posible subvertir los genéricos y terminar con un List<Integer>
que (por ejemplo) realmente contiene String
s. Esto claramente podría volverse imposible si la información tipográfica se reificara; ¡Pero debe haber más que esto !
¿Podrían las personas publicar ejemplos de cosas que realmente querrían hacer si estuvieran disponibles los genéricos reificados? Quiero decir, obviamente podrías obtener el tipo de List
en tiempo de ejecución, pero ¿qué harías con él?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDITAR : Una actualización rápida de esto, ya que las respuestas parecen estar principalmente preocupadas por la necesidad de pasar a Class
como parámetro (por ejemplo EnumSet.noneOf(TimeUnit.class)
). Estaba buscando más algo parecido a donde esto simplemente no es posible . Por ejemplo:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
tendría que ignorar la parametrización, pero defineClass()
no podría). Y como sabemos, The Powers That Be mantienen la compatibilidad con versiones anteriores de manera primordial.