java泛型程序设计——无限定通配符+通配符捕获
【0】README
0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 无限定通配符+通配符捕获 的相关知识;
【1】无限定通配符相关
1.1)无限定通配符: 如Pair< ?>;
- 1.1.1)类型 Pair< ?> 有方法如下所示:
? getFirst() : 返回值只能赋给 Object,;
void setFirst(?) : setFirst 方法不能被调用, 甚至不能用 Object 调用;
- 1.1.2)Pair< ?> 和 Pair 本质不同在于: 可以用任意 Object对象调用原始的 Pair类的setObject 方法; (也可以调用 setFirst(null));
1.2)为什么要使用 无限定通配符?
- 1.2.1)看个荔枝:下面方法将用来测试一个 pair 是否包含一个 null 引用, 它不需要实际的类型;
public static boolean hasNulls(Pair<?> p)
{return p.getFirst() == null || p.getSecond() == null;
}
- 1.2.2)通过将 hasNulls 转换成泛型方法, 可以避免使用 通配符类型:
public static <T> boolean hasNulls(Pair<T> p) , 但是带有通配符的版本可读性更强了;
【2】通配符捕获相关
2.1)出现的问题:
- 2.1.1)通配符不是类型变量, 不能在编写代码中使用 ? 作为一种类型, 下面代码是非法的:
? t = p.getFirst(); // ERROR
p.setFirst(p.getSecond());
p.setSecond(t);
2.2)解决方法: 编写一个辅助方法 swapHelper, 如下所示:
public static <T> void swapHelper(Pair<T> p)
{T t = p.getFirst();p.setFirst(p.getSecond());p.setSecond(t);
}
Attention) swapHelper 是一个 泛型方法, 而 swap不是, 它具有固定的Pair
public static void swap(Pair<?> p)
{ swapHelper(p); }
2.4)当然, 在这种情况下, 并不是一定要使用通配符。
- 2.4.1)我们已经直接实现了 没有 通配符的泛型方法 void swap(Pair p) , 看个荔枝:
public static void maxminBonus(Manager[] a, Pair<? super Manager> result)
{minmaxBonus(a, result);PairAlg.swap(result) ; //OK--swapHelper captures wildcard type
}
- 在这里,通配符捕获机制是不可避免的;
- 2.4.2)通配符捕获只有在很多限制的情况下才是合法的。
- 编译器必须能够确信通配符表达的是 单个、确定的类型;如, ArrayList< Pair< T>> 中的T 永远不能捕获 ArrayList< Pair< ?>> 中的通配符;
java泛型程序设计——无限定通配符+通配符捕获相关推荐
- java泛型程序设计——类型变量限定 + 泛型代码和虚拟机
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机 的知识: [1]类型变量的限定 ...
- java泛型程序设计——通配符类型+通配符的超类型限定
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...
- java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例 的知识 ...
- java泛型程序设计——反射和泛型
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识: [1]反射和泛型相关 1.1)现在, Cl ...
- java泛型程序设计——翻译泛型表达式+翻译泛型方法
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 翻译泛型表达式+翻译泛型方法 的知识: [1]翻译泛型表达式 1.1 ...
- java泛型程序设计——泛型类型的继承原则
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类型的继承原则 的知识: [1]泛型类型的继承原则相关 1.1) ...
- java泛型程序设计——注意擦除后的冲突
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 注意擦除后的冲突 的知识: 1.1)当泛型类型被 擦除时, 无法创建 ...
- java泛型程序设计——Varargs 警告+不能实例化类型变量
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识: [1] Vara ...
- java泛型程序设计——约束与局限性
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 约束与局限性 的知识: [1] 不能用基本类型实例化类型参数 1.1 ...
最新文章
- 对抗性攻击轻松愚弄人工智能
- 服务器Linux与Windows固件,Linux与windows服务器系统的区别
- 时间序列预测之一:指数平滑法(二)R语言——代码实现
- Apache的shiro获取当前Session的方法
- 【Python】is 和 == 的区别
- Vue + Element UI + Moment.js——el-table-column的时间戳格式转换解决方案
- ITK:预定义操作以对应两个图像中的像素
- GRPC与.net core
- 双重差分模型能做固定效应吗_数据分析之道 | 双重差分法(DID)
- Python之路(二)Python基础
- linux用usermod修改密码,Linux笔记(usermod命令,用户密码管理,mkpasswd)
- 操作系统概念学习笔记一 进程
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-3.Vidoe相关接口完善和规范协议...
- 考拉升级https经验
- JMX实现远程服务器Tomcat系统监控之三
- Spring Boot拦截器配置拦截登陆
- mysql卸载后重装不_mysql卸载无法重装怎么办?
- 重读经典:《The Craft of Research(1)》
- Macbookpro开机只能进入恢复模式后的解决方案(过程太戏剧性了有时间可以看完)
- 叉乘和平行四边形面积
热门文章
- ABC 189 E - Rotate and Flip 矩阵转移
- 几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)
- ARC080F - Prime Flip(贪心,差分,二分图匹配)
- 第1节 连通性强连通、割点和桥(一)
- P7516 [省选联考 2021 A/B 卷] 图函数
- CF1556F-Sports Betting【状压dp,数学期望】
- P5287-[HNOI2019]JOJO【KMP】
- CF1137F-Matches Are Not a Child‘s Play【LCT】
- P4831-Scarlet loves WenHuaKe【组合数学】
- jzoj1213-棋盘上的士兵【状压dp】