¿Alguien sabe por qué no se compila el siguiente código? Ni add() ni addAll() funcionan como se esperaba. Eliminar la parte "? Extends" hace que todo funcione, pero no podría agregar subclases de Foo.Listas con comodines Causa Error genérico de vudú
List<? extends Foo> list1 = new ArrayList<Foo>();
List<? extends Foo> list2 = new ArrayList<Foo>();
/* Won't compile */
list2.add(new Foo()); //error 1
list1.addAll(list2); //error 2
de error 1:
IntelliJ dice:
add(capture<? extends Foo>) in List cannot be applied to add(Foo)
El compilador dice:
cannot find symbol
symbol : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>
de error 2:
IntelliJ me da
addAll(java.util.Collection<? extends capture<? extends Foo>>) in List cannot be applied to addAll(java.util.List<capture<? extends Foo>>)
Mientras que el compilador sólo dice
cannot find symbol
symbol : method addAll(java.util.List<capture#692 of ? extends Foo>)
location: interface java.util.List<capture#128 of ? extends Foo>
list1.addAll(list2);
favor explicar por qué se utiliza se extiende Foo>, en cambio solo Foo. Al explicar eso, tal vez las cosas se aclararán. – Ingo
Hola, Ingo. Excelente punto, y uno que podría haber creado respuestas mejores/más precisas anteriormente. Estaba confundido por los parámetros del método usando comodines para aceptar subtipos, y pensé que necesitaba usar el amplía la notación Foo> para poder agregar subtipos a la colección. Myers y Paulo (abajo) ayudaron a entender por qué eso no es necesario (o correcto). Buen comentario, ¡gracias! – oligofren