JAVA:集合泛型的思考

JAVA中关于<? extends T> 和<? super T>的思考

传送门:[知乎问题]
(https://www.zhihu.com/question/20400700)
思考的主要问题在于set/get在两种方式下的不同之处。

1 <? extends T>:

知乎拿来的

存放的:任何是T或者T的子类的对象。 <= T
可以get,反正这些对象最终都是T或者T的父类。 取出来时,只需要声明为>=T。
无法set,因为不知道到底装的什么类型,无法往里面存储数据(不知道要存储哪种子类类型)。

2 <? super T>:

依然是知乎搬来的图
存放的:任何是T或者T的父类的对象 。 >=T
可以set, 反正放一个T或者T的子类进去完全没问题。放进去任何一个<=T的都行。不能存储T的基类型,因为T基类有很多种,不能确定是存储哪一种,同时基类之间也不见得可以互相转化。

不能get(实际可以取,取出来是Object)。取得时候也不能确定具体是什么,但是,所有对象最终其实都是Object的子类,因此其实可以取出来,但是不建议用。

其实想明白一点:“子类一定是父类,父类不一定能转子类“”。
用图里的关系图做说明:

extends fruit都是<=fruit的对象,因此肯定不能放>=fruit的对象(Food肯定不行呀,关系反了,fruit is a type of food);但是又不知道具体类型,所以也不能放 < fruit 的对象,反正最后就是不能往里面set。
取的时候,那必须都是fruit,甚至可以声明为Food,要是你愿意,Object伺候。
2.
super fruit都是>=fruit的对象,放一个fruit的子类或者fruit都可以,可以向上转型(Apple、Banana都是水果,直接往里面塞就是了)。fruit的基类可能存在并列关系,基类之间不一定能互相转,而且也不确定到底是啥玩意儿,所以不能放基类进去(图中没有例子,但是这个意思应该不难理解)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值