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; /** * ? -->通配符,类型不确定,用于声明 变量| ...
随机推荐
- robotframwork接口测试(五)—接口分层测试粗解
个人小结,仅供参考. 接口测试很简单,但是很重要. 可以写代码,也可以用工具进行测试.工具说说就很多了,简单介绍一下我目前用过的几个能够测试接口的工具, Burpsuite:这类偏请求攻击类软件 Fi ...
- Oracle 表单的创建
1.-- 连接 conn hu/aaa; -- 创建表空间 Create tablespace computer2005 nologging datafile 'd:/Oracle/product/1 ...
- oracle 基本知识点
//创建临时表空间create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\oradata\testserver ...
- assignment1SVM的一些经验
def svm_loss_vectorized(W, X, y, reg): """ Structured SVM loss function, vectorized i ...
- P1414 又是毕业季II
题目描述 彩排了一次,老师不太满意.当然啦,取每位同学的号数来找最大公约数显然不太合理.于是老师给每位同学评了一个能力值.于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约 ...
- 进程调度之FCFS算法(先来先运行算法)
#include<stdio.h> #define PNUMBER 5//进程个数 #define SNUMBER 3//资源种类个数 //资源的种类,三种 char stype[SNUM ...
- 404 Note Found 队-Beta5
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 【ev】视频软件
EV系列:EV录屏.EV剪辑
- linux文件系统初始化过程(1)---概述
术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 st ...
- mysql索引和外键
innodb外键: 1.CASCADE:从父表删除或更新会自动删除或更新子表中匹配的行 2.SET NULL:从父表删除或更新行,会设置子表中的外键列为NULL,但必须保证子表列没有指定NOT NUL ...