8.6.1 不能用基本类型实例化类型参数
没有 Pair
8.6.2 运行时类型查询只适用于原始类型
得到编译器的错误:
if (a instanceof Pair<String>)
if (a instanceof Pair<T>)
得到警告:
Pair<String> p = (Pair<String>) a;
getClass 是相等的:
8.6.3 不能创建参数化类型的数组
var table = new Pair<String>[10]; // ERROR
类型擦除使 table 的类型变为 Pair[]:
// 可转换为 Object[]
Object[] objarray = table;
objarray[0] = "Hello"; // ERROR
objarray[0] = new Pair<Employee>(); // 与 Pair<String> 不匹配
声明还是合法的:
Pair<String>[]
// 不能初始化, new Pair<String>[10]
8.6.4 Varargs 警告
不能手动创建泛型数组, 但是可以使用 Varargs 创建的泛型数组:
public static <T> void addAll(Collection<T> coll, T... ts) {
for (T t : ts) {
coll.add(t);
}
}
Java 虚拟机会创建 Pair
抑制警告:
// 使用注解
@SuppressWarnings("unchecked")
public static <T extends Collection> void addAll(Collection<T> coll, T... ts) {
for (T t : ts) {
coll.addAll(t);
}
}
8.6.5 不能实例化类型变量
public Pair() {
first = new T(); // ERROR
second = new T(); // ERROR
}
8.6.6 不能构造泛型数组
8.6.7 泛型类的静态上下文中类型变量无效
8.6.8 不能抛出或捕获泛型类的实例
同时不能扩展 Throwable:
catch 中不能使用类型变量:
在异常规范中可以使用类型变量:
上面截图, 书中的代码没写明白.