类型参数提高了可读性、安全性
泛型类的定义:
public class Pair<T>
{
private T first;
private T second;
public Pair() { first = null; second = null; }
public Pair(T first, T second) { this.first = first; this.second = second; }
public T getFirst() { return first; }
public T getSecond() { return second; }
public void setFirst(T newValue) { first = newValue; }
public void setSecond(T newValue) { second = newValue; }
}
泛型方法定义:
public static <T extends Comparable> Pair<T> minmax(T[] a)
虚拟机没有泛型类型对象。
定义泛型类型,都自动提供了一个相应的原始类型(第一个限定类型或Object类型)
翻译泛型表达式(编译器插入强制类型转换)
类型擦除与多态可能发生冲突,(编译器生成一个桥方法,以保持多态)
约束与限制:(类型擦除引起)
不能用基本类型实例化类型参数,没有Pairm<double>,只有Pair<Double>
运行时类型查询只适应原始类型
Pair<String> stringPair=...
Pair<Employee> employeePair=...if(stringPair.getClass() == employeePair.gatClass()) //PairClass 相同
不能创建参数化类型数组
Pair <String>[] table = new Pair <String>[10]; //Error
不能实例化类型变量
new T() new T[] T.Class 都错误
可以使用:
public <T> Pair<T> make(Class<T> c1){
c1.newInstance();
} // Class类本身是泛型
泛型类的静态上下文中类型变量无效
不能抛出或捕获泛型类的实例
public class Problem<T> extends Exception{} // Error
可以
public static <T extends Trowable> void doWork(T t) throws T{}// 合法
通配符的超类型限定 ? super Manager