文章目录
第8章 泛型程序设计
8.1 为什么要使用泛型程序设计
类型参数: new ArrayList<ClassType>();
通配符类型
8.2 定义简单泛型类
// 可以有多个类型变量
public class Pair<T>
{
private T first;
pair()
{
first = null;
}
public T getFirst()
{
return first;
}
public setFirst(T newValue)
{
first = newValue;
}
}
8.3 泛型方法
// 类型变量 <T> 放在修饰符后面,返回类型前面,可定义在普通类中
public static <T> T getMiddle(T... a)
{
return a[a.length / 2];
}
// 调用泛型方法,把具体类型放在方法名之前(大多数情况可省略,编译器能推断出)
String middle = <String>getMiddle("a", "b", "c");
8.4 类型变量的限定
可以有多个接口超类型,但最多有一个限定可以是类,而且它必须是限定列表的第一个限定。
// 限制T只能是实现了Comparable接口的类 T是限定类型的子类型
public static <T extends Comparable & Serializable, D> T min(T[] a) ...
8.5 泛型代码和虚拟机
- 虚拟机没有泛型类型对象——所有对象都属于普通类;
- 类型变量会被擦除,替换为其限定类型(无限定类型替换为Object);
- 合成桥方法来保持多态;
- 为保持类型安全性,必要时会插入强制类型转换。
8.6 限制与局限性
- 不能用基本类型代替类型参数,因为类型擦除后的Object类不能存储基本类型值;
- 运行时类型检查只适用于原始类型,虚拟机中对象总有一个特定的非泛型类型;
- 不能创建参数化类型的数组;
- 不能实例化类型变量;
- 不能构造泛型数组;
- 泛型类的静态上下文中类型变量无效;
- 不能抛出或捕获泛型类的实例;
8.7 泛型类型的继承规则
Pair<Employee> 与 Pair<Manager> 没有关系
ArrayList<T> 实现了 List<T> 接口,可以转换为 List<T>
8.8 通配符类型
Pair<? extends Employee>
Pair<Manager>
// 通配符的超类型限定(可以为方法提供参数,不能使用返回值)
Pair<? super Manager>
// 无限定通配符
Pair<?>