【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泛型程序设计——无限定通配符+通配符捕获相关推荐

  1. java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机 的知识: [1]类型变量的限定 ...

  2. java泛型程序设计——通配符类型+通配符的超类型限定

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...

  3. java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例 的知识 ...

  4. java泛型程序设计——反射和泛型

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识: [1]反射和泛型相关 1.1)现在, Cl ...

  5. java泛型程序设计——翻译泛型表达式+翻译泛型方法

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 翻译泛型表达式+翻译泛型方法 的知识: [1]翻译泛型表达式 1.1 ...

  6. java泛型程序设计——泛型类型的继承原则

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 泛型类型的继承原则 的知识: [1]泛型类型的继承原则相关 1.1) ...

  7. java泛型程序设计——注意擦除后的冲突

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 注意擦除后的冲突 的知识: 1.1)当泛型类型被 擦除时, 无法创建 ...

  8. java泛型程序设计——Varargs 警告+不能实例化类型变量

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识: [1] Vara ...

  9. java泛型程序设计——约束与局限性

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 约束与局限性 的知识: [1] 不能用基本类型实例化类型参数 1.1 ...

最新文章

  1. 对抗性攻击轻松愚弄人工智能
  2. 服务器Linux与Windows固件,Linux与windows服务器系统的区别
  3. 时间序列预测之一:指数平滑法(二)R语言——代码实现
  4. Apache的shiro获取当前Session的方法
  5. 【Python】is 和 == 的区别
  6. Vue + Element UI + Moment.js——el-table-column的时间戳格式转换解决方案
  7. ITK:预定义操作以对应两个图像中的像素
  8. GRPC与.net core
  9. 双重差分模型能做固定效应吗_数据分析之道 | 双重差分法(DID)
  10. Python之路(二)Python基础
  11. linux用usermod修改密码,Linux笔记(usermod命令,用户密码管理,mkpasswd)
  12. 操作系统概念学习笔记一 进程
  13. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-3.Vidoe相关接口完善和规范协议...
  14. 考拉升级https经验
  15. JMX实现远程服务器Tomcat系统监控之三
  16. Spring Boot拦截器配置拦截登陆
  17. mysql卸载后重装不_mysql卸载无法重装怎么办?
  18. 重读经典:《The Craft of Research(1)》
  19. Macbookpro开机只能进入恢复模式后的解决方案(过程太戏剧性了有时间可以看完)
  20. 叉乘和平行四边形面积

热门文章

  1. ABC 189 E - Rotate and Flip 矩阵转移
  2. 几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)
  3. ARC080F - Prime Flip(贪心,差分,二分图匹配)
  4. 第1节 连通性强连通、割点和桥(一)
  5. P7516 [省选联考 2021 A/B 卷] 图函数
  6. CF1556F-Sports Betting【状压dp,数学期望】
  7. P5287-[HNOI2019]JOJO【KMP】
  8. CF1137F-Matches Are Not a Child‘s Play【LCT】
  9. P4831-Scarlet loves WenHuaKe【组合数学】
  10. jzoj1213-棋盘上的士兵【状压dp】