wildcards parameter method generic example español create bounded java generics wildcard

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