泛型 java extends,关于Java 泛型 ?extends T 的有关问题

关于Java 泛型 ?extends T 的问题

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

问:

在学习java泛型时 ,看到了泛型的一个例子

List apples = new ArrayList();

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

super than

ArrayList

方向是祖先类=>子孙类

但是在涉及容器是否可添加元素判断时,因编译时容器元素类型只是根据? extends Fruit来确定,因此会报不确定子类型,比如即使改成这样也会编译报错:

List apples = new ArrayList();

List extends Fruit> fruits = apples;

fruits.add(new Apple()); //compile error

这个10楼说过了

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值