泛型程序设计
泛型类
1 2 3 4 5 6 7 8 9 10 11
| public class Pair<T> { private T first; private T second;
public T getFrist() { return first; } public setFrist(T newValue) { first = newValue; } }
|
泛型方法
普通类中定义泛型方法,需要在方法定义的返回值前面加上类型变量
1 2 3 4 5
| class ArrayAlg { public static <T> T getMiddle(T a) { return a; } }
|
类型变量的限定
如果使用类作为限定,则必须是限定列表中的第一个
1 2 3
| public static <T extends Comparable> T getMiddle(T a) { return a; }
|
泛型代码和虚拟机
类型擦除
原始类型用第一个限定的类型变量来替换,如果没有给定限定符则用Object替换
翻译泛型方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class DateInerval extends Pair<LocalDate> { public void setSecond(LocalDate second) {
} }
class DateInterval extends Pair { public void setSecond(LocalDate second) {
} }
DateInterval interval = new DateInterval(...); Pair<LocalDate> pair = interval; pair.setSecond(pair);
public void setSecond(Object second) { setSecond((Date) second); }
|
约束和局限
- 不能用基本类型实例化类型参数,没有
Pair<double>
- 运行时类型查询只适用于原始类型,
getClass()返回Pair.class
- 不能创建参数类型化的数组,
Pair<String> table = new Pair<>[10]
- 不能实例化类型变量,
new T()
- 不能构造泛型数组,
T[] mm = new T[2]
通配符类型
通配符
子类限定:? extends Employee
超类限定: ? super Manager
无限定:?