En mi último question (gracias a todos los que me responden), he aprendido la diferencia entre List<Object>
y List<?>
.Java: comodines de nuevo
Sin embargo, todavía no puedo ver la utilidad de los comodines.
Tengo dos ArrayList
s:
ArrayList<Integer> li = new ArrayList<Integer>(Arrays.asList(1,2,3));
ArrayList<String> ls = new ArrayList<String>(Arrays.asList("one","two","three"));
Ahora, mira a los dos bloques de código a continuación:
static void printList(ArrayList<?> list)
{
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
y
static <T> void printList(ArrayList<T> list)
{
for (T elem: list)
System.out.print(elem + " ");
System.out.println();
}
Cuando llamo:
printList(li);
printList(ls);
Ambos métodos devuelven la salida:
1 2 3
one two three
Sin embargo, la segunda solución, en el bucle, en lugar de Object
s que utilizan tipos parametrizados (mucho más elegante, creo).
Entonces, la pregunta principal sigue siendo: ¿Por qué necesitamos comodines?
comodines se hicieron justo al final del trabajo de genéricos. Citando a Josh Bloch cuando habla de cierres. "Simplemente no podemos permitirnos otro comodín". Creo que tampoco piensa mucho en ellos. ¿Solo uso? cuando están limitados. por ejemplo, extiende MyObj> – RNJ