关于Java 泛型 ?extends T 的问题

http://topic.csdn.net/u/20120516/22/a19617f5-943e-494c-9595-1c049b1cc3ef.html?seed=208934876&r=78626688#r_78626688

问:

在学习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;为什么不报错呢?

 

答:

我觉得现在剩下来的一个主要问题就是为什么在加元素时以子类型不确定的理由而编译错误(这个可以理解,? extends Fruit就表示某一种unknown type,范围是包括Fruit及其子类),在apples赋给fruits时就没有以同样的理由报错,我想是设计上的原因,类型范围意义上它们是可以这 样排列的:
List<? extends Fruit>

super than

List<Apple>

super than

ArrayList<Apple>

方向是祖先类=>子孙类

但是在涉及容器是否可添加元素判断时,因编译时容器元素类型只是根据? extends Fruit来确定,因此会报不确定子类型,比如即使改成这样也会编译报错:
List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;
fruits.add(new Apple()); //compile error

这个10楼说过了

但我们知道实际上这个List要装的就是Apple,但在编译时就不知道。

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

你可能感兴趣的:(extends)