Java Collection.add和Collection.addAll中的一些问题 boolean addAll(Collection

Java Collection.add和Collection.addAll中的一些问题 boolean addAll(Collection,java,generics,Java,Generics,对于类型为T的集合,上界通配符是必需的 boolean addAll(Collection<? extends E> c); boolean add(E e); 你说你希望收集的是具体类型的动物,而不是只T,它是容器。现在这又能起作用了 void addAll(Collection<? extends T> t){}; animalContainer.addAll(cats);//将起作用,因为addAll(CollectionAnything扩展了E的东西也是E。但

对于类型为T的集合,上界通配符是必需的

boolean addAll(Collection<? extends E> c);
boolean add(E e);
你说你希望收集的是具体类型的
动物
,而不是
T
,它是
容器
。现在这又能起作用了

void addAll(Collection<? extends T> t){};

animalContainer.addAll(cats);//将起作用,因为addAll(CollectionAnything扩展了E的东西也是E。但是,由于泛型是不变的,同样的原理不适用。@bcsb1001其中不变性意味着
集合
不是
集合
。请参阅。(这是为了OP的利益而提供的,不是你的;这只是根据你的评论:))为什么动物可以在
animalContainer.add(dogs.get(0));
?@sibo.wang看这里对不起,我认为这些答案不能解决我的问题。@sibo.wang这正是你要问的问题。
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());

ArrayList<Cat> cats = new ArrayList<>();
cats.add(new Cat());

Container<Animals> animalContainer = new Container<>();
animalContainer.add(dogs.get(0)); // will work since add(T t)
animalContainer.addAll(cats); // will not work since addAll(Collection<T> t)
void addAll(Collection<? extends T> t){};
 animalContainer.addAll(cats); // will work since addAll(Collection<? extends T> t)