<? extends T>和<? super T>:上下界通配符的界限和使用
2017-10-23 16:45
555 查看
<? extends T>:是指
“上界通配符(Upper Bounds Wildcards)”
<? super T>:是指
“下界通配符(Lower Bounds Wildcards)”
举一个简单的例子:
1、上界通配符
三个类:红苹果类继承苹果类,苹果类继承水果类
2、下界通配符
3、上下界通配符的副作用
①、上界通配符
以List<? extends Apple> list = new ArrayList<Apple>();为例
在调用list的add方法的时候我们可以看到下面的提示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/08/b689d59c01f44d89c5950a95d1699b67)
原因在于,编译器只知道这个集合的泛型类型是苹果的子类,但是至于那个子类,编译器无法确定,就导致了集合中除了null,其他的什么都放不进去。而对于上界的取操作,则没有任何的影响,依然通过下标进行获取集合中的对象。
②、下界通配符
以List<? super Apple> list = new ArrayList<Apple>();为例
调用时候的提示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/08/81a80191765d0e378a39565a0422b7a0)
我们可以看到能够放入苹果类型的对象,也就意味着,苹果或者苹果子类的对象都可以放入集合中。原因在于,编译器知道这个集合的泛型是苹果的超类,那么里面的对象只要是苹果或者苹果的子类,肯定是满足集合的要求的。
而对于取操作则要受到一定的影响:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/08/ed453aee540e3aac0921ec8723e3c46a)
从编译器的角度,我能够知道这个集合的泛型是苹果的超类,但是里面的对象究竟是苹果还
a42a
是水果,则不得而知,只能用最大的界限object。
4、上下界通配符的使用
遵循PECS(Producer
Extends Consumer Super)原则:
频繁往外读取内容的,适合用上界Extends。
经常往里插入的,适合用下界Super。
“上界通配符(Upper Bounds Wildcards)”
<? super T>:是指
“下界通配符(Lower Bounds Wildcards)”
举一个简单的例子:
1、上界通配符
三个类:红苹果类继承苹果类,苹果类继承水果类
list<? extends Apple>//表示可能是一个苹果或者苹果子类的集合所以就有了一下的这几种情况
List<? extends Apple> list1 = new ArrayList<RedApple>(); List<? extends Apple> list2 = new ArrayList<Apple>(); List<? extends Apple> list3 = new ArrayList<Fruit>();前两种情况是编译通过的,第三种情况编译错误。
2、下界通配符
List<? super Apple> list//表示可能是苹果或者苹果超类的集合相同的三种情况
List<? super Apple> list4 = new ArrayList<RedApple>(); List<? super Apple> list5 = new ArrayList<Apple>(); List<? super Apple> list6 = new ArrayList<Fruit>();第一种情况编译错误,后两种情况编译通过
3、上下界通配符的副作用
①、上界通配符
以List<? extends Apple> list = new ArrayList<Apple>();为例
在调用list的add方法的时候我们可以看到下面的提示:
原因在于,编译器只知道这个集合的泛型类型是苹果的子类,但是至于那个子类,编译器无法确定,就导致了集合中除了null,其他的什么都放不进去。而对于上界的取操作,则没有任何的影响,依然通过下标进行获取集合中的对象。
②、下界通配符
以List<? super Apple> list = new ArrayList<Apple>();为例
调用时候的提示:
我们可以看到能够放入苹果类型的对象,也就意味着,苹果或者苹果子类的对象都可以放入集合中。原因在于,编译器知道这个集合的泛型是苹果的超类,那么里面的对象只要是苹果或者苹果的子类,肯定是满足集合的要求的。
而对于取操作则要受到一定的影响:
从编译器的角度,我能够知道这个集合的泛型是苹果的超类,但是里面的对象究竟是苹果还
a42a
是水果,则不得而知,只能用最大的界限object。
4、上下界通配符的使用
遵循PECS(Producer
Extends Consumer Super)原则:
频繁往外读取内容的,适合用上界Extends。
经常往里插入的,适合用下界Super。
相关文章推荐
- java泛型中,上下界通配符(<? extends T>跟<? super T>)
- Java中 <? super T>,<? extends T>,和<T>的区别
- 理解泛型通配符(List<? extends T > & List< ? super T>)
- Java中<? extends T>和<? super T>的理解,泛型的使用规则
- 泛型中<? super T> 和<?extends T>的区别
- 泛型 <? extends Object> <? super Object>
- Java学习之道:简述泛型通配符<? extends T>和<? super T>
- java <? super Fruit>与<? extends Fruit>
- 理解Java 泛型 :<? super T> 和<? extends T>
- <? extends T>和<? super T>
- Java中 <? super T>,<? extends T>,和<T>的区别
- java泛型中<? super T> 和<? extends T>的区别---转发
- <? extends AnyClass> <? super AnyClass>
- <? extends T>和<? super T>区别
- <? extends T> 和 <? super T>分别是什么意思?有什么不同?
- <? extends T>和<? super T> 的解释
- 浅谈Java泛型中的<? extends E>和<? super E>的区别
- <? extends T>和<? super T>的理解
- <? extends A> 和 <? super A> 的意思
- Java学习之道:简述泛型通配符<? extends T>和<? super T>