Java那些事-泛型通配符
Java的类型通配符,可以出现在类、方法上面。最常用的方式就是集合类,例如List,Set等类上面。
通配符类型
- 有泛型参数 List
- 有无类型标识 List< ? >
- 有通用的标识 List< object >
- 边界通配符 List<? extends Class>
- 边界通配符 List<? super Class>
本文主要讨论的是最后的关于边界的通配符类型。
看一个例子
public static void main(String[] args) {
List<B> bList = new ArrayList();
bList.add(new A());
bList.add(new B());
bList.add(new C());
A a3 = bList.get(0);
B b3 = bList.get(0);
C C3 = bList.get(0);
List<? extends B> bExtends = new ArrayList();
bExtends.add(new A());
bExtends.add(new B());
bExtends.add(new C());
A a1 = bExtends.get(0);
B b1 = bExtends.get(0);
C C1 = bExtends.get(0);
List<? super B> bSuper = new ArrayList();
bSuper.add(new A());
bSuper.add(new B());
bSuper.add(new C());
A a2 = bSuper.get(0);
B b2 = bSuper.get(0);
C C2 = bSuper.get(0);
}
}
class A {
String a = "a";
}
class B extends A {
String b = "b";
}
class C extends B {
String c = "c";
}
有三个类,继承关系是A < B < C。
然后声明了三个数组,list,extends,super.
上面的代码是编译不通过的。分别在第3、7、11-13、16、19、22-24行。
原理分析
List<? extends B> 得到的是B及B的子类的一个集合。
List<? super B> 得到的是B及B的父类的一个集合。
List 得到的是一个B的集合。
- ? extends B 声明了上界标识符、不定下界,而add(E e)的时候,编译器无法确定e需要分配的声明类型,虽然有实际类型,这个地方跟多态不一致,所以编译器不通过;而get(int i)的操作,会获取到一个肯定是B的元素,故是安全的。
- ? super B正相反,声明的是下界标识符、不定上界(Object),当add(E e)的时候,添加的是子类型,子类型向上转型是安全的;get(int i)的时候,并不能确定拿到的会是一个怎样的类型,可能是Object,也能是A,故也是违规的。
- B 声明的是上下界为B。add(E e)按照多态性,可以添加为B的类型及其子类型;get(int i)返回的必然是B的类型。
代码错误验证
按照第1条解释,第3、11-13行的错误符合解释。
按照第2条解释,第19、22-24行的错误符合解释。
第7、16行是由于向下转型是不安全的,股编译错误。
小结
extends和super别定义了上下限,结论如下面的表格
| extends | super | T | |
|---|---|---|---|
| add | unsafe | safe | safe |
| get | safe | unsafe | safe |
Java那些事-泛型通配符的更多相关文章
- 【Java】java 中的泛型通配符——从“偷偷地”地改变集合元素说起
一直没注意这方面的内容,想来这也算是基础了,就写了这个笔记. 首先java的通配符共有三种----先别紧张,现在只是粗略的过一下,看不看其实无所谓 类型 介绍 <?> 无限定通配符,等价于 ...
- JAVA基础补漏--泛型通配符
泛型通配符只能用于方法的参数 不能用对象定义 public class Test { public static void main(String[] args) { ArrayList<Str ...
- 简谈 Java 中的泛型通配符
很好的一篇文章https://zhuanlan.zhihu.com/p/26681625
- java泛型通配符?
转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T 有类型 ? 未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- Java 泛型 通配符类型
Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...
- java里程碑之泛型--类型通配符
1,泛型与数组在子类上面的对比 在整理java泛型的类型通配符之前,我们先来研究下java在数组设计上的一个不合理.我们来看下面代码: public class Test { public stati ...
- -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器
集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别? A:长度区别 ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- java泛型---通配符,泛型嵌套
package generic; import java.util.ArrayList; import java.util.List; /** * ? -->通配符,类型不确定,用于声明 变量| ...
随机推荐
- hacknet
网盘下载地址,下载后cmd运行hacknet.exe 链接:https://pan.baidu.com/s/1gTrcuDRzDhepFlXhsOMVlg 提取码:os9v 经过5个小时的战斗,终于通 ...
- 【转】 Android xml中 @和?区别,style和attr小结
引用资源时,使用@还是?的区别,例如在设置style的时候既可以使用@也可以使用? style="?android:attr/progressBarStyleHorizontal" ...
- Day1 Mybatis初识(一)
框架 将重复的,繁琐的代码实现封装,让程序员将更多的精力放在业务的理解和分析上. 框架的作用 提高开发效率 隐藏细节 三大框架SSH --> SSM 1) 表述层: 用户 ...
- [Java123]Gradle
https://dzone.com/articles/gradle-vs-maven https://docs.gradle.org/current/userguide/what_is_gradle. ...
- 关于lora标配SPDT大功率射频开关
SPDT大功率的UltraCMOS ™DC - 3.0 GHz射频开关 PE4259的UltraCMOS ™射频开关被设计为覆盖广泛的,通过3000兆赫从近DC应用.这种反射 ...
- no persistent volumes available for this claim and no storage class is set FailedBinding -- nfs --存储
添加PV标签oc label pv registrypv disktype=registry oc get pv --show-labels NAME CAPACITY ACCESSMODES REC ...
- 2019北航OO第一单元作业总结
一.前三次作业内容分析总结 前言 前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式 ...
- Oracle透明网关访问MySQL数据库
针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数 ...
- 记一次ss无法上网的排查
从日志开始排查. 登录服务器端 $ ssh root@[IP] 关闭 ss,再次启动并其指定日志输出文件 $ ssserver -c /etc/shadowsocks.json -d stop $ s ...
- macOS 开启 VNC 远程桌面和 SSH 服务
macOS 开启 VNC 远程桌面和 SSH 服务 准备用 macOS 来做为服务器,既然是服务器,那不可缺少的是远程管理,实际上 macOS 自带 VNC 远程桌面和 SSH 服务,只是默认没有开启 ...