No, no hay manera legal directa (aparte de moldes de tipo inseguro). Solo puede agregar elementos a una colección genérica declarada con super
, no extends
. Esto puede ser más fácil de recordar con las siglas PECS (productor - se extiende, al Consumidor - súper), popularizada por Josh Bloch en Effective Java, 2ª Edición, artículo 28.
De hecho lo que parece ser después no parece tener sentido directo. Un List<? extends Animal>
puede ser, p. a List<Dog>
o List<Cat>
. El primero solo puede aceptar Dog
elementos, el último solo Cat
s. Y dado que no puede crear instancias de tipos genéricos (no identificables) en Java, debe saber en tiempo de ejecución que está tratando con una lista de perros, por lo que solo intenta agregarle perros (y viceversa para los gatos). Eso significa que no puede crear de forma local y estática los objetos que se agregarán; también debe obtenerlos de una manera genérica y, además, de una manera que le permita al compilador asegurarse de que los tipos concretos coincidan cada vez. La forma más sencilla de hacerlo es pasar el elemento (s) como un parámetro genérico. Por lo que es posible y segura de hacer esto:
public <E extends Animal> void addAllAnimals(List<E> animalLikeList, E animal) {
animalLikeList.add(animal);
}
List<Dog> dogs = new ArrayList<Dog>();
List<Cat> cats = new ArrayList<Cat>();
addAllAnimals(dogs, new Dog());
addAllAnimals(cats, new Cat());
Tenga en cuenta que este método es genérico, con un parámetro de tipo de llamada, lo que garantiza que el tipo genérico real de la lista es el mismo que el tipo de elemento que se añade lo.
Puede reemplazar trivialmente el parámetro E
con Collection<E>
para agregar varios objetos a la vez.
No conseguir su pregunta? –
Lo edité Akhil. Quiero saber si hay alguna forma (cualquier forma maliciosa) de agregarle elementos. ¡O es realmente IMPOSIBLE! – namalfernandolk
¿Por qué usas el comodín si pretendes infringir su restricción, simplemente no tiene sentido? –