浅谈Java泛型之<? extends T>和<? super T>的区别
关于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>的区别的更多相关文章
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Java泛型中的extends和super关键字(转)
通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: 向上造型一个泛型对象的引用 向下造型一个泛型对象的引用 向上造型一个泛型对象 ...
- 浅谈Java泛型中的extends和super关键字
泛型是在Java 1.5中被加入了,这里不讨论泛型的细节问题,这个在Thinking in Java第四版中讲的非常清楚,这里要讲的是super和extends关键字,以及在使用这两个关键字的时候为什 ...
- JAVA泛型知识--> <? extends T>和<? super T>
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
- 浅谈Java泛型中的? extends E和?super E
https://blog.csdn.net/zymx14/article/details/78073757
- 浅谈Java——泛型DAO
首先解释一下为什么要学习泛型DAO.平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法.当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是 ...
- 浅谈Java中的Set、List、Map的区别(转)
对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java ...
- 浅谈Java中的Set、List、Map的区别
http://developer.51cto.com/art/201309/410205_all.htm
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
随机推荐
- gcc shared object
介绍一个生成动态链接库*.so的例子: 首先新建1个头文件test.h: #include <stdio.h> void first(); void second(); void thir ...
- Nuget很慢,我们该怎么办
在VS中给项目添加程序已经采用NuGet 十分方便 不过很多时候速度很慢,一直显示“正在检索信息” 其实直接使用程序包管理控制台,速度就会好很多 如果命令不太会写,安装包名不是确认,可以先登录 htt ...
- WinForm 窗体应用程序 (初步)之二
现在,我们来了解一些基本控件.控件是放置在工具箱里的,你可以在界面的左侧或者通过菜单栏的视图选项找到它. (1)Label 控件 这是一个用于放置文字的控件,因为你不能在窗体上直接输入文字. (2)T ...
- c# 学习心得(函数方法类)
函数或者说方法都是写在类下的,我们可以通过函数名来调用它们.首先,我们要弄清楚为什么会有函数或者说方法这种东西?这里,我们使用了与前一篇同样的思维方式,先从它的目的或者实用价值出发.当我们在编写程序的 ...
- SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
- 从0开始学angularjs-笔记04
由于公司加班,刚到家不久,然而却毫无睡意,可能是老了吧--- 不废话了,没睡意那就做点有意义的事情吧,继续我们的angular学习之路,深夜博文,希望能造福大家! 这次我们来详细讲解angular的双 ...
- ABAP 锁机制
- user profile services提示“BAIL: MMS(7116): sql.cpp(8490): 0x80231334 (The sql connection string has unsupported values.)”解决办法
user profile services的2个服务Forefront Identity Manager Service 和 Forefront Identity Manager Synchroniz ...
- Android消息机制入门
接着处理<Android 网络图片查看器>中出现的问题 使用添加子线程,修改原程序: package com.wuyudong.imagesviewer; import java.io.I ...
- 【iOS】WebView加载HTML图片大小自适应与文章自动换行
在很多App中都会使用到webview,尤其是在加载新闻内容等文章形式的数据时.因为图文混编以及不同字体格式的显示,在iOS进行编辑 和显示都是一大问题(当然,iOS中也可以用CoreText进行绘制 ...