There is any way to fix this situation (I have try to simplyfy the scenario as much as i could):
public class Test {
public static void main(String[] args) {
/*
* HERE I would like to indicate that the CollectionGeneric can be of
* something that extends Animal (but the constructor doesn't allow
* wildcards)
*/
CollectionGeneric extends Animal> animalsCollectionGeneric = new CollectionGeneric();
List extends Animal> animals = getAnimals();
/* Why I cannt do that? */
animalsCollectionGeneric.setBeans(animals);
}
private static List extends Animal> getAnimals() {
return new ArrayList();
}
}
class CollectionGeneric {
private List beans;
public List getBeans() {
return (beans != null) ? beans : new ArrayList();
}
public void setBeans(List beans) {
this.beans = beans;
}
}
interface Animal {}
class Dog implements Animal{}
this scenario is giving me the next error:
The method setBeans(List) in the type
CollectionGeneric is not applicable for
the arguments (List)*
I am not sure about if there is a way to do this with generics,
解决方案
What this means is that the two collections can not be proved to have the same type bounds:
CollectionGeneric extends Animal> animalsCollectionGeneric =
new CollectionGeneric();
List extends Animal> animals = getAnimals()
The first one might at runtime have CollectionGeneric and the second one List. Mixing those would mean you lose the type safety ( not to mention the carnage ).
Therefore you need to prove to the compiler that those two are related, so your generic signatures should be:
public void setBeans(List extends T> beans) {}
public List getBeans();
and used as:
List extends Animal> beans = getBeans();
GenericCollection animals = new GenericCollection();
animals.add(beans);