前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java泛型通配符 ? extends T 和 ? super T 的区别和用法

java泛型通配符 ? extends T 和 ? super T 的区别和用法

作者头像
挨踢小子部落阁
发布2020-01-15 15:22:50
1.1K0
发布2020-01-15 15:22:50
举报

点击上方“挨踢小子”,“选择关注”或者“设置星标”

优质文章第一时间送达!

https://www.cnblogs.com/chyu/p/4630798.html

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

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

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

代码语言:javascript
复制
//子类-->父类

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

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

那么 代表的是左侧小红苹果,红苹果和苹果的类中的某个类,而代表的就是苹果和水果,好吃的,吃的,的类中的某个类.

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

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

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

代码语言:javascript
复制
List<? extends 苹果>  list = new ArrayList<苹果>();
list.add(苹果);    //编译错误
list.add(红苹果);    //编译错误
list.add(小红苹果);     //编译错误

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

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

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

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

代码语言:javascript
复制
List<? super 苹果>  list = new ArrayList<苹果>();
list.add(苹果);    //无任何问题
List<? super 苹果>  list = new ArrayList<水果>();
list.add(苹果);    //无任何问题

推荐一位有走心的coder,致力于打造一款高质量技术学习社群,他专注于分享Java技术干货,包括面试攻略,开发技巧,架构设计,职场心得等。

添加好友,回复入群,即可同业界牛人一同成长

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 挨踢小子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档