Cuando inter-operar con código heredado que no especifica los parámetros de tipo para los tipos genéricos, utilice un comodín. Por ejemplo, supongamos que usted está llamando a un método en una biblioteca antigua que simplemente devuelve una prima Collection
:
Collection getItems();
En su código, asignar el resultado a una variable declarada con un comodín:
Collection<?> items = widget.getItems();
Este De esta manera, conservas la seguridad del tipo para que no recibas ninguna advertencia.
El código heredado podría especificar (lo más probable es que en un comentario) cuáles deberían ser los parámetros genéricos. Por ejemplo:
/**
* @return the items, as a Collection of {@link Item} instances.
*/
Collection getItems();
En este caso, tiene una opción. Usted puede arrojar el resultado a Collection<Item>
, pero si lo hace, está confiando 100% en la biblioteca de terceros, y descartando la seguridad de los tipos genéricos de Java: que cualquier ClassCastException
generado en tiempo de ejecución ocurrirá en un explícito emitir.
¿Qué sucede si no confía plenamente en la biblioteca de terceros, pero todavía necesita producir un Collection<Item>
? Luego, cree una nueva colección y agregue los contenidos después de enviarlos al tipo esperado. De esta forma, si hay un error en la biblioteca, lo descubres enseguida, en lugar de tener un código muy lejos y mucho más tarde explotar misteriosamente con un ClassCastException
.
Por ejemplo:
Collection<?> tmp = widget.getItems();
Collection<Item> items = new ArrayList<Item>(tmp.size());
for (Object o : tmp)
items.add((Item) o); /* Any type error will be discovered here! */
Para un caso en el que el parámetro de tipo no se conoce en tiempo de compilación, puede utilizar la type-checked collection factories de la clase Collections
.
El problema es que eso no te gana nada más que silenciar las advertencias de "tipo sin formato". ¡Convertir a los genéricos implicaría hacer uso de sus beneficios! –
¿Cuál es el beneficio de los genéricos? ¡No es para hacer que tu código se vea bonito y requiera menos tipeo! Es esto: * Se garantiza que su código será seguro si se compila sin advertencias. * Eso es todo. Cuando ignoras o suprimes las advertencias, es mejor que no uses genéricos en absoluto, porque todo lo que estás haciendo es crear situaciones en las que código sin un operador de conversión misteriosamente provoca 'ClassCastException'. – erickson