Java泛型-通配符的上限和下限问题
Java的泛型中,通配符可以设置上限和下限。
上限:<? extends T> ?是T和T的子类
下限:<? super T> ?是T和T的父类
怎么看待这个上限和下限呢 首先应该想 其实对于Java来说 <? extends T> <? super T> 是两个确定的类型,因为它不可能由你的赋值完了再确定吧。所以,对于<? extends T> 来说,集合里的元素应该是什么类型呢?应该是T类型,因为你添加的是T或者T的子类,设置为T就可以激发多态了。是了,所以你也只能从这个集合中取出T类型,因为它里面的元素本来设置的就是T类型,你赋值进去只不过是将T的子类赋值给了T,多态。但是呢,你就不能给这个集合里添加元素了,因为这个集合里元素的类型是T,假如可以添加元素,你初始化的时候初始化成T的一个子类,然后添加值的时候,却添加的另一个子类,事实上是可以添加的,因为集合元素类型是T,但里面就有了多种T的子类,好了,你初始化的时候是这个子类,你取出元素的时候肯定也想着取出的是可以给这个子类赋值的类型,但很有可能取出来的是T的另一个子类,你没法赋值,因为你允许添加另一个子类。所以一开始就禁止添加元素是对的。
<? super T>里面的元素,应该设置为什么呢?显然应该是object,因为系统不知道你会把?当成什么,所以只能设置成object,所以你取出元素的时候,取出的是object类。可不可以添加元素呢?可以,因为下限有保证,所以可以添加T和T的子类。你初始化的时候,初始化的是T的某个父类,好了,你现在取元素,你希望取出的是你初始化的那个父类,因为你只能添加T和T的子类,所以你取出的元素,肯定可以赋值给那个父类。
综上,<? extends T> 不可以添加元素,但可以取出类型为T的元素。 <? super T> 可以添加T或者T的子类,取出的一定是object类。
最新文章
- go reflect
- yii2.0邮箱发送
- mongodb sharding配置
- matlab文件操作及读txt文件(fopen,fseek,fread,fclose)
- 2016年10月28日 星期五 --出埃及记 Exodus 19:13
- Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 .
- Unity中的单实例
- WEB开发者必备的7个JavaScript函数
- VM Depot 分布式计算框架主题应用精选
- C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩
- JavaScript 继承机制小记
- 论JS的重要性
- 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
- 在block内如何修改block外部变量
- 用‘+=’拼接字符串,打印时总会出现一个undefined
- Python Face Detect Offline
- MySQL在线DDL gh-ost 使用说明
- 阿里云挂载硬盘(windows)
- Redis-05.主从复制与Sentinel
- netty的解码器和粘包拆包
热门文章
- zepto.fullpage
- ACM学习历程—Hihocoder 1178 计数(位运算 &;&; set容器)(hihoCoder挑战赛12)
- ACM学习历程——NOJ1113 Game I(贪心 || 线段树)
- 高性能的序列化与反序列化:kryo的简单使用
- mac hosts
- CAS单点登录学习(二):客户端配置
- Docker入门(一):简介
- IOS要用到的零碎东西
- 《精通Spring4.X企业应用开发实战》读后感第四章(Application中Bean的生命周期)
- 【机器学习】迭代决策树GBRT(渐进梯度回归树)