import java.util.List;
import java.util.ArrayList;
interface Canine {}
class Dog implements Canine {}
public class Collie extends Dog {
public static void main(String[] args){
List<Dog> d = new ArrayList<Dog>();
List<Collie> c = new ArrayList<Collie>();
d.add(new Collie());
c.add(new Collie());
do1(d); do1(c);
do2(d); do2(c);
}
static void do1(List<? extends Dog> d2){
d2.add(new Collie());
System.out.print(d2.size());
}
static void do2(List<? super Collie> c2){
c2.add(new Collie());
System.out.print(c2.size());
}
}
此问题的答案表明,当方法采用通配类型typ时,可以访问或修改集合,但不能同时采用这两种。 (凯西和Bert)泛型较低的未绑定vs较高的有界通配符
是什么意思“当一个方法接受一个通配符通用典型值,收集可以访问或修改,但不能同时”?
据我所知, 方法do1有List<? extends Dog> d2
所以d2只能访问但不能修改。 方法d2有List<? super Collie> c2
所以c2可以被访问和修改,并且没有编译错误。
请参见[Java中的'super'和'extends'有什么区别](http://stackoverflow.com/questions/1910892/what-is-the-difference-between-super-and-extends- in-java-generics) – Jesper
请参阅[Java泛型:什么是PECS?](http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs) – Jesper
请参见[泛型中的通配符:“?超级T“同时工作”?扩展T“不?](http://stackoverflow.com/questions/7541849/wildcards-in-generics-super-t-works-while-extends-t-does-not) – Jesper