今天写集合遇到一个问题 求各位大神看看 代码如下
List<? super Person> l = new ArrayList<Person>();
l.add(new Person("张三", 20));
l.add(new Person("李四", 30));
l.add(new Person("王五", 25));
l.add(new Person("赵六", 24));上面的代码能执行没问题
List<? extends Person> al = new ArrayList<Person>();
al.add(new Person("张三", 20));
al.add(new Person("李四", 30));
al.add(new Person("王五", 25));
al.add(new Person("赵六", 24));
这样写第一句没问题,但不能调用方法 这是为什么
 class Person {
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这是Peroson类

解决方案 »

  1.   

    因为不论向下兼容或者向上兼容都应该包含Person类
    为什么向下兼容就会报错?问题是这个
      

  2.   


    List<? extends Person> al 的意思是“Person,或者 Person 的某种子类型的List”,就是说,满足条件的类型是“Person,或者 Person 的某种子类型”,就是说,不确定是哪种具体的类型满足条件,就是说,给出任何一种具体的类型,都不确定其是否满足条件,就是说,实际操作的时候等同于“任何类型都不满足条件”。
    所以,你不能往里添加任何元素,但是你可以从中取出元素或遍历元素,
    对于取出的元素,你虽然不知道它具体是哪种类型,但是你知道它一定是Person的子类型,
    所以,可以用Person类型的变量来接收。
      

  3.   

    那为什么第一种 List<? super Person> l 就能往里加 Person 对象?
    因为这种说:  Person,或者某种 Person 的父类型的 List满足条件的类型,是类型 x , x 的具体类型未知,也许是Person,也许是Person的某种父类型但是不管是哪种, x 满足条件的同时, x 的所有子类型也满足条件不管 x 是哪种类型, 已知 Person 一定是 x 的子类型或 x 本身,换句话说,虽然 x 未知,但是已知 Person 一定满足类型检查的条件。