当前位置:编程学习 > JAVA >>

泛型问题求助高手

今天写集合遇到一个问题 求各位大神看看 代码如下
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类 --------------------编程问答-------------------- 去掉?和extends
--------------------编程问答-------------------- 去掉能执行我也知道 我就想知道为什么用向下兼容就会出错?? --------------------编程问答-------------------- 因为不论向下兼容或者向上兼容都应该包含Person类
为什么向下兼容就会报错?问题是这个 --------------------编程问答--------------------
引用 2 楼  的回复:
去掉能执行我也知道 我就想知道为什么用向下兼容就会出错??


List<? extends Person> al 的意思是“Person,或者 Person 的某种子类型的List”,

就是说,满足条件的类型是“Person,或者 Person 的某种子类型”,

就是说,不确定是哪种具体的类型满足条件,

就是说,给出任何一种具体的类型,都不确定其是否满足条件,

就是说,实际操作的时候等同于“任何类型都不满足条件”。


所以,你不能往里添加任何元素,但是你可以从中取出元素或遍历元素,
对于取出的元素,你虽然不知道它具体是哪种类型,但是你知道它一定是Person的子类型,
所以,可以用Person类型的变量来接收。 --------------------编程问答-------------------- 那为什么第一种 List<? super Person> l 就能往里加 Person 对象?


因为这种说:  Person,或者某种 Person 的父类型的 List

满足条件的类型,是类型 x , x 的具体类型未知,也许是Person,也许是Person的某种父类型

但是不管是哪种, x 满足条件的同时, x 的所有子类型也满足条件

不管 x 是哪种类型, 已知 Person 一定是 x 的子类型或 x 本身,

换句话说,虽然 x 未知,但是已知 Person 一定满足类型检查的条件。 --------------------编程问答-------------------- 明白了 谢谢
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,