泛型问题求助高手

ddtppa 2012-10-06 09:08:43
今天写集合遇到一个问题 求各位大神看看 代码如下
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类
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddtppa 2012-10-06
  • 打赏
  • 举报
回复
明白了 谢谢
raistlic 2012-10-06
  • 打赏
  • 举报
回复
那为什么第一种 List<? super Person> l 就能往里加 Person 对象?


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

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

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

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

换句话说,虽然 x 未知,但是已知 Person 一定满足类型检查的条件。
raistlic 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

去掉能执行我也知道 我就想知道为什么用向下兼容就会出错??
[/Quote]

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

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

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

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

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


所以,你不能往里添加任何元素,但是你可以从中取出元素或遍历元素,
对于取出的元素,你虽然不知道它具体是哪种类型,但是你知道它一定是Person的子类型,
所以,可以用Person类型的变量来接收。
ddtppa 2012-10-06
  • 打赏
  • 举报
回复
因为不论向下兼容或者向上兼容都应该包含Person类
为什么向下兼容就会报错?问题是这个
ddtppa 2012-10-06
  • 打赏
  • 举报
回复
去掉能执行我也知道 我就想知道为什么用向下兼容就会出错??
zly361814478 2012-10-06
  • 打赏
  • 举报
回复
去掉?和extends

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧