关于设置了类型通配符上限的list不能添加其上限类及其子类对象的解释

在一个java项目内有Life,Animal,Plant类,其中Animal与Plant类是Life的子类

定义如下集合:   

List<? extends Life> list=new ArrayList<>();

list.add(new Life());//出错

list.add(new Animal());//出错

list.add(new Plant());//出错


原因:由于List集合变量list并不知道自己能够存储的数据类型,list不能判断你要加入的对象是否满足条件,比如此时list是一个plant的集合,那么你就不能把Life的对象加入进去,更不能将Animal对象加进去。所以list不能添加Life及其子类Plant和Animal对象。

上述代码与如下代码并不等价:

List<Life> life=new ArrayList<>();

life知道自己能够存储的数据类型(Life),因此life可以存入是LifeLife子类的实例。


所有泛型变量在使用的时候都是确定好的类型,但使用?声明的集合变量不知道自己最终会是图中3种的哪一种(3条虚线的哪一条)。这和抛出的硬币是一样的道理,虽然被抛出的硬币有两种可能(正面和反面),但最终它只能呈现正面和反面的其中一面。同样你也不能这样创建集合对象-->new ArrayList<? extends Life>();这样创建的对象就好比在说空中的硬币落地后能同时显示正反两面。

有一个如下方法:

public <T extends Life> void method(T t){

List<T> list=new ArrayList<T>();

list.add(t);

}


上述方法中的list之所以可以添加,是因为list知道自己的最终类型,就好比我们知道了硬币落地后的结果再说出硬币落地的正反面,自然100%是正确的。


list.add(null);//不出错

原因:null是所有引用类型的实例,满足约束条件,所以可以添加。













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值