parameter - Genéricos de Java, colección anidada de comodines.
parameterized method in java (5)
Bueno, las explicaciones son correctas, pero creo que también sería bueno agregar la solución de trabajo real;)
List<? extends List<? extends Object>>
Funcionará bien, pero obviamente el uso de tal colección está bastante limitado por las limitaciones habituales de las Colecciones genéricas (pero lo mismo es cierto para la Lista más simple <? Extiende Fecha>)
Esto compila (1.6)
List<? extends Object> l = new ArrayList<Date>();
Pero esto no
List<List<? extends Object>> ll = new ArrayList<List<Date>>();
con el error de
Type mismatch: cannot convert from ArrayList<List<Date>> to List<List<? extends Object>>
¿Podría alguien explicar por qué? Gracias
EDIT: editado por ser consecuente
Cuando se asigna a una variable ( List<T>
) con un tipo genérico no comodín T
, el objeto que se asigna debe tener exactamente T
como su tipo genérico (incluidos todos los parámetros de tipo genérico de T
, comodín y no comodín). En tu caso T
es List<? extends Object>
List<? extends Object>
, que no es el mismo tipo que List<Date>
.
¿Qué puede hacer, porque la List<Date>
es asignable a la List<? extends Object>
List<? extends Object>
, es usar el tipo de comodín:
List<? extends List<? extends Object>> a = new ArrayList<List<Date>>();
Porque rompería la seguridad del tipo:
List<List<Object>> lo = new ArrayList<List<Object>>();
List<List<? extends Object>> ll = lo;
List<String> ls = new ArrayList<String>();
ll.add(ls);
lo.get(0).add(new Object());
String s = ls.get(0); // assigns a plain Object instance to a String reference
Supongamos que D
es el subtipo de B
, G<T>
es un tipo genérico
B x = new D(); // OK
G<B> y = new G<D>(); // FAIL
Ahora, G<Date>
es un subtipo de G<?>
, Por lo tanto
G<?> x = new G<Date>(); // OK
G<G<?>> y = new G<G<Date>>(); // FAIL
<? extends Object>
significa que el comodín podría sustituirse solo por esos objetos, que son subclase de la clase Object
.
List<List<? extends Object>> ll = new ArrayList<List<Object>>();
le da un error de tipo de discrepancia porque está intentando asignar un ArrayList
of List of object de la clase java Object
a una List
que contiene la List
de cualquier tipo de objetos que son subclase de la clase java Object
.
Para más referencias, echa un vistazo a la documentación de comodines