JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)
一.通配符上限和通配符下限接受的类型
通配符上限:<? extends T>
通配符下限:<? super T>
以下代码是测试结果,注释为解释说明
package xayd.hjj; import java.util.ArrayList;
import java.util.List; class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{} public class Test{ public static void main(String[] args) { //下面五行代码说明:List<? extends A>接受A或者继承A的类
List<? extends A> listA = new ArrayList<A>();
List<? extends A> listB = new ArrayList<B>();
List<? extends A> listC = new ArrayList<C>();
List<? extends A> listD = new ArrayList<D>();
// List<? extends A> listE = new ArrayList<E>(); //编译不能通过,类E与类A无关 //下面三行代码说明:List<? super B>接受B或者的父类
List<? super B> listA1 = new ArrayList<A>();
List<? super B> listA2 = new ArrayList<B>();
List<? super B> listF = new ArrayList<F>();
//List<? super B> listC1 = new ArrayList<C>(); //编译不能通过,类C不是类B的父类 30 }
}
二.通配符下限和通配符上限存取问题
通配符上限:<? extends A>
List<? extends A> list = new ArrayList<B>();
这样定义一个list的时候,是不允许向这个list添加任何东西的。list可以接受其B类型和B的子类。像list中添加对象的时候因为编译器不能确定这个子类的确切类型,因此不允许向里添加任何对象。唯一可以添加的是null。也可以这样理解:Fruit是Apple的父类,也是orange的父类。但是你不能说Fruit就是Apple或者orange。
代码测试如下:
package xayd.hjj; import java.util.ArrayList;
import java.util.List;
class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{}
public class Test{
public void a(List<? extends A> list){
list.add(null); //编译通过,但无实际意义
// list.add(new B()); //编译不能通过
// list.add(new A()); //编译不能通过 } public static void main(String[] args) {
Test test = new Test();
List<? extends A> listB = new ArrayList<B>();
test.a(listB); }
}
通配符下限:<? super B>
List<? super B> list = new ArrayList<A>();
这样定义一个list的时候,允许向这个list添加对象。list可以接受其B类型和B的父类。像list中添加对象的时候编译器能确定确切类型。也可以这样理解:Fruit是Apple的父类,也是orange的父类。我们可以说Apple就是一个Fruit。
代码测试如下:
package xayd.hjj; import java.util.ArrayList;
import java.util.List;
class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{}
public class Test{ public void b(List<? super B> list){ list.add(new B()); ////编译通过
//list.add(new A()); //编译不能通过,要使用类型转换
list.add((B) new A()); ////编译通过 }
public static void main(String[] args) {
List<? super B> listA = new ArrayList<A>();
test.b(listA); }
}
JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)的更多相关文章
- 浅谈Java泛型之<? extends T>和<? super T>的区别
关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...
- Java泛型中extends和super的理解(转)
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...
- Java泛型中extends和super的理解
作者:zhang siege链接:https://www.zhihu.com/question/20400700/answer/91106397来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- java泛型中extends 和 super的区别
一般对泛型中extends 和 super 的区别是这样介绍的: 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 < ...
- JAVA泛型知识--> <? extends T>和<? super T>
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
- Java泛型中extends和super的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- java泛型<? extends E> 有上限通配符与<? Super E>有上限通配符
通配符?,?表示占位,表明将来使用的时候在指明类型 <?>无限定的通配符, 是让泛型能够接受未知类型的数据 <? extends E> 有上限通配符,能够接受指定类及其子类类型 ...
- Java笔记2 : 泛型的体现,及其上限、下限、通配符
Java中的泛型是在jdk5.0引入的,语法不难,但是需要注意的细节有很多,这里写一下备忘. 首先是最简单的泛型类,泛型方法,泛型接口: //泛型接口的定义 interface MyInter< ...
- Java泛型-通配符的上限和下限问题
Java的泛型中,通配符可以设置上限和下限. 上限:<? extends T> ?是T和T的子类 下限:<? super T> ?是T和T的父类 怎么看待这个上限和下限呢 首先 ...
随机推荐
- android用户界面之ScrollView教程实例汇总
--------------------------汇总不容易啊------------------------------- 一.ScrollView基础知识 1.Android中ScrollVie ...
- Bertelsmann Asia Investments, 简称BAI
聚焦龙宇:贝塔斯曼的中国风险投资之路 _财经_腾讯网 贝塔斯曼亚洲投资基金(Bertelsmann Asia Investments, 简称BAI )
- StreamWrite-StreamRead 读写文本文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)-大壮他哥
步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...
- 读取中兴3G告警log告警文件到集合
1.文件格式 ALARM_ID=102305_404205 EVENT_TIME=-- :: NOTIFICATION_TYPE= MANAGED_OBJECT_INSTANCE=NodeId=,Bs ...
- InsertOnSubmit、InsertAllOnSubmit等区别 (转)
a. InsertOnSubmit: 将一个实体添加到datacontext对象中,并在SubmitChange()的时候执行更改. b. InsertAllOnSubmit:将一个实体集合添加到da ...
- androidstudio 优化gradle编译效率
androidstuido 使用gradle自己主动构建和编译.有时做少量改动编译须要等待时间过长,近期Erik Hellman编写的Boosting the performance for Grad ...
- Object-c @property的用法
property是一种代码生成机制,可以生成不同类型的getter/setter函数,特别是假设你想要用点(.)操作符号来存取变量的话,你就能必须使用property. 怎样使用? 使用方法如:@pr ...
- FFMPEG H264/H265 编码延迟问题
最新使用FFmpeg进行H264的编码时,发现视频编码有延迟,不是实时编码.进过一番研究发现,仅仅要在调用avcodec_open2函数 打开编码器时,设置AVDictionary參数就可以.关键代码 ...
- smartforms换页,
smartforms换页,可以把最后的窗口设置成最终窗口, 这样页码有可以用系统变量控制: 总页码/页码 :&SFSY-FORMPAGES&