日期:2014-05-20  浏览次数:20719 次

关于Java 泛型 ?extends T的问题,搞不清楚
在学习java泛型时 ,看到了泛型的一个例子

List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;
fruits.add(new Strawberry());

其中,Fruit是父类、Apple和Strawberry是子类,add操作执行错误,给出的解释是

“这个? extends T 通配符告诉编译器我们在处理一个类型T的子类型,但我们不知道这个子类型究竟是什么。因为没法确定,为了保证类型安全,我们就不允许往里面加入任何这种类型的数据。”

我不明白编译器怎么会不知道这个子类型是什么呢?如果不知道的话,语句List<? extends Fruit> fruits = apples;为什么不报错呢?



------解决方案--------------------
探讨
3ks lxbccsu、dracularking、n5233873,我是不是能这么理解:

List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;
这两句确定了fruits这个list此时只能存储Apple了,不可以再存储其他子类了