第8章 泛型程序设计
- 使用泛型要比直接使用Object,让后进行强制类型转换要安全
8.1 为什么要使用泛型程序设计
- 一个ArrayList类可以聚集任何类型的对象,这是一个泛型程序设计的实例
8.1.1 类型参数的好处
- 如果强制类型转换不是真实类型,就会产生异常
- 泛型提供了一个更好的解决方案:类型参数
- 提高了可读性与安全性
8.1.2 谁想成为泛型程序员
8.2 定义简单泛型类
8.3 泛型方法
8.4 类型变量的限定
-
T extends Comparable
:用extends而不用implements是因为extends包含子类的概念,更加形象
8.5 泛型代码和虚拟机
8.5.1 类型擦除
- 无论何时定义一个泛型类型,都自动提供一个原始类型
- 无限定类型参数,直接替换为Object
- 有限定类型的参数,替换为限定类型
8.5.2 翻译泛型表达式
- 当程序调用泛型类时
- 调用原始方法
- 将结果强转为泛型类型
8.5.3 翻译泛型方法
- 虚拟机中没有泛型,只有普通的类和方法
- 为保持类型安全性,必要时插入强制类型转换
8.5.4 调用遗留代码
- 注解会关闭对方法中所有代码的检查
@SuppressWarnings("unchecked")
8.6 约束与局限性
8.6.1 不能用基本类型实例化类型参数
8.6.2 运行时类型查询只适用于原始类型
- 泛型对象,只有一个原始类型
-Pair<?>
,无论?是什么类型,只有一个Pair.class
8.6.3 不能创建参数化类型的数组
-
Pair<String>[] table = new Pair<String>[10];
这是错误的
- 如果需要收集参数化类型对象,只有一种方法:
ArrayList<Pair<String>>
8.6.4 Varargs警告
- 可变参数,本质是数组,这种情况下使用参数化类型数组,只有警告,并不是错误
8.6.5 不能实例化类型变量
8.6.6 不能构造泛型数组
8.6.7 泛型类的静态上下文中类型变量无效
8.6.8 不能抛出或捕获泛型类的实例
- 泛型类扩展Throwable是不合法的
- 泛型对象不能catch
- 可以throw和throws
8.6.9 可以消除对受查异常的检查
- Java异常处理的一个基本原则是,必须为所有的受查异常提供一个处理器
8.6.10 注意擦除后的冲突
8.7 泛型类型的继承规则
- 无论S与T有什么联系,通常,
Pair<S>
与Pair<T>
没有什么联系
8.8 通配符类型
8.8.1 通配符概念
8.8.2 通配符的超类型限定
8.8.3 无限定通配符
-
Pair<?>
:仅仅只能使用get方法,返回Object,不能使用set方法
8.8.4 通配符捕获
public static void swap(Pair<?> p) {
swapHelper(p);
}
8.9 反射和泛型
8.9.1 泛型Class类
8.9.2 使用Class<T> 参数进行类型匹配
-
Employee.class
是类型Class<Employee>
的一个对象
8.9.3 虚拟机中的泛型类型信息
- 擦除的类仍然保留一些泛型祖先的微弱记忆,例如,原始的Pair类知道源于泛型类Pair<T>
网友评论