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

posted @ 2019-08-26 10:40  知识航海家布尔  阅读(365)  评论(0编辑  收藏  举报