关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通、一般、通用的,是一个概括性的词,那么泛型从名字上也就好理解了,它是一种通用类型,是java中各种类型的概括.

?是java泛型中的通配符,它代表java中的某一个类,那么<? extends T>就代表类型T的某个子类,<? super T>就代表类型T的某个父类.

这里我们先定义一组有继承关系的类:

//子类-->父类

小红苹果--红苹果--苹果--水果--好吃的--吃的

这些类都是左侧的类为与它相连接的右侧的类的子类.

那么<? extends 苹果> 代表的是左侧蓝字和绿字的类中的某个类,而<? super 苹果>代表的就是绿字和红字的类中的某个类.

这里要注意的是<? extends T>或是<? super T>代表的是范围内的某个特定的类,而不是范围内的所有类.

//所以只要在范围内,我们可以如下这样的随意赋值
List<? extends 苹果> list1 = new ArrayList<苹果>();
List<? extends 苹果> list2= new ArrayList<红苹果>();
List<? extends 苹果> list3 = new ArrayList<小红苹果>();

但是对于List<? extends 苹果> list来说,代表的是一个范围内的某个类,但是却不确定是哪个类,所以如果我们向这个list中添加元素的时候:

List<? extends 苹果>  list = new ArrayList<苹果>();
list.add(苹果); //编译错误
list.add(红苹果); //编译错误
list.add(小红苹果); //编译错误

因为编译器并不知道list到底是哪个类(只有在运行的时候才能确定指代的哪个类),如果list是红苹果,那么list.add(苹果)就将一个父类赋值给子类了,是错误的.显然如果向这个list中添加类,都不能保证是正确的.可能会说小红苹果没有子类,添加小红苹果不会错,但是这只是我定义的一个继承图中是这样,我们完全可以继续定义个小小红苹果来继承小红苹果,这个继承是没有下限的.这个反推出一个结论<? extends T>是一个有上限T的类型.那么我们马上就发现<? super T>实际上是有下限T的类型.

因为对于<? extends T>有上限T,故我们如果list.get(0)一定返回的是T或是T的子类,这个是确定的,得出:

List<? extends 苹果>  list1 = new ArrayList<苹果>();
苹果 a = list1.get(0); //这个是一定成立的,编译也不会有问题
List<? extends 苹果>  list2 = new ArrayList<红苹果>();
苹果 a = list2.get(0);
List<? extends 苹果>  list3 = new ArrayList<小红苹果>();
苹果 a = list3.get(0);

然后我们来看<? super T>,因为它有下限,故我们可以马上得出,如果向其中添加T类型的对象是没问题的.因为<? super T>是T的某个父类,将子类T赋值给父类没任何问题:

List<? super 苹果>  list = new ArrayList<苹果>();
list.add(苹果); //无任何问题
List<? super 苹果> list = new ArrayList<水果>();
list.add(苹果); //无任何问题

浅谈Java泛型之<? extends T>和<? super T>的区别的更多相关文章

  1. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  2. 浅谈Java泛型中的extends和super关键字(转)

    通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: 向上造型一个泛型对象的引用 向下造型一个泛型对象的引用 向上造型一个泛型对象 ...

  3. 浅谈Java泛型中的extends和super关键字

    泛型是在Java 1.5中被加入了,这里不讨论泛型的细节问题,这个在Thinking in Java第四版中讲的非常清楚,这里要讲的是super和extends关键字,以及在使用这两个关键字的时候为什 ...

  4. JAVA泛型知识--> <? extends T>和<? super T>

    <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...

  5. 浅谈Java泛型中的? extends E和?super E

    https://blog.csdn.net/zymx14/article/details/78073757

  6. 浅谈Java——泛型DAO

    首先解释一下为什么要学习泛型DAO.平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法.当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是 ...

  7. 浅谈Java中的Set、List、Map的区别(转)

    对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java ...

  8. 浅谈Java中的Set、List、Map的区别

    http://developer.51cto.com/art/201309/410205_all.htm

  9. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

随机推荐

  1. 10款免费的响应式 WordPress 主题下载

    响应式和现代设计风格的 WordPress 主题与能够非常灵活的适应所有设备.而高级主题能够更大可能性的轻松定制.所有的主题是完全响应式的,您可以从主题选项中禁用/启用响应模式.下面这个列表收集了10 ...

  2. 25款创新的 PSD 格式搜索框设计素材【免费下载】

    这一次,我们给大家带来的素材是25款很有吸引力的搜索框 PSD 设计,你可以免费下载使用.有时候,搜索框容易被访客忽视,因为其简单和没有吸引力的设计.如果这是你所面对的问题,那么我们会鼓励你去看看在这 ...

  3. 百度地图API使用方法详解

    最近做了个项目,其中项目中有个需求需要用到百度地图进行导航,通过查阅相关资料参考百度地图api完成了一个例子. API地址:http://developer.baidu.com/map/jsdemo. ...

  4. hibernate 入门([数据访问中间件] 开源框架)

    1.内容:  hibernate 也是一个经典的[数据访问中间件] 开源框架.    2.hibernate核心组件       SessionFactory[整个数据的操作]重量级组件       ...

  5. 解决html表格中内容超出不强制换行和超出宽度自动隐藏并显示省略号

    在表格布局中经常会遇到因为表格内容长短的变化导致布局混乱的情况,这个时候我们可能会有为了布局稳定把单元格宽度写死的情况:但是我们设置了宽度却发现超出了宽度之后会自动变大,用css定义元素的overfl ...

  6. CSS3之3D变换实例详解

    CSS3的3D效果很赞,本文实现简单的两种3D翻转效果.首先看效果和源代码,文末是文绉绉的总结部分^_^ 以下CSS代码为了简洁没有添加前缀,请视情况自行添加(自动化时代推荐使用其他的一些方法,如gu ...

  7. Android MediaPlayer的生命周期

    MediaPlayer的状态转换图也表征了它的生命周期,如下: 这张状态转换图清晰的描述了MediaPlayer的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时 ...

  8. 我的android学习经历

    我为什么选择android? 我基本上前一年的时间都是在学习java的语法和线程之类的,没有注意java的分类,所以到现在慢慢接触到深处的时候我了解到,java的优势主要在web,而我不是特别喜欢网页 ...

  9. Caliburn.Micro 关闭父窗体打开子窗体

    比如我们在做登录的时候需要关闭父窗体打开子窗体.使用Caliburn.Micro它的时候我们关闭登录窗口的时候主页面也会关闭. 解决方法就是在登录页面的CS里面写 IndexView iv = new ...

  10. Android中应用程序清除data/data,清除cache,超详细

    清除data,清除cache,其实在Android原生Setting里面有这个功能的. 需求是把这个功能做到自己的App里面,并计算出cache和data的size. 所以参考了一下Setting的源 ...