JAVA泛型 - 约束与局限性
泛型不能使用基本类型
Pair<double> //Error
Pair<Double> // Right
运行时类型查询只适用于原始类型
虚拟机中的对象总有一个特定的非泛型类型。 因此, 所有的类型查询只产生原始类型。
if (a instanceof Pair<String>) // Error
if (a instanceof Pair<T>) // Error
Pair<String> p = (Pair<String>) a; // Warning-can only test that a is a Pair
Pair<String> stringPair = . .
Pair<Employee> employeePair = . .
if (stringPair.getClassO == employeePair.getClassO) // they are equal
不能创建参数化类型的数组
虚拟机在创建参数化类型数组时会擦除泛型
Pair<String>[] table = new Pair<String>[10]; // Error
Pair<String>[] table = (Pair<String>[]) new Pair<?>[10]; //不安全
ArrayList<Pair<String>> //推荐
Varargs 警告
在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告。鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全的操作,可使用@SafeVarargs进行标记,这样的话,Java编译器就不会报unchecked警告。
@SuppressWamings("unchecked") 也可以排除警告
不能实例化类型变量
public Pair() { first = new T(); second = new T(); } // Error
官方文档给出一些实例化方案,不过我并没有看懂。 //TODO
不能构造泛型数组
public static <T extends Comparable〉T[] minmax(T[] a) { T[] = new T[2]; . . . } // Error