8.6.1 不能用基本类型实例化类型参数

没有 Pair, 只有 Pair.

8.6.2 运行时类型查询只适用于原始类型

得到编译器的错误:

  1. if (a instanceof Pair<String>)
  2. if (a instanceof Pair<T>)

得到警告:

  1. Pair<String> p = (Pair<String>) a;

getClass 是相等的:

image.png

8.6.3 不能创建参数化类型的数组

  1. var table = new Pair<String>[10]; // ERROR

类型擦除使 table 的类型变为 Pair[]:

  1. // 可转换为 Object[]
  2. Object[] objarray = table;
  3. objarray[0] = "Hello"; // ERROR
  4. objarray[0] = new Pair<Employee>(); // 与 Pair<String> 不匹配

声明还是合法的:

  1. Pair<String>[]
  2. // 不能初始化, new Pair<String>[10]

8.6.4 Varargs 警告

不能手动创建泛型数组, 但是可以使用 Varargs 创建的泛型数组:

  1. public static <T> void addAll(Collection<T> coll, T... ts) {
  2. for (T t : ts) {
  3. coll.add(t);
  4. }
  5. }

Java 虚拟机会创建 Pair 数组:

image.png

抑制警告:

  1. // 使用注解
  2. @SuppressWarnings("unchecked")
  3. public static <T extends Collection> void addAll(Collection<T> coll, T... ts) {
  4. for (T t : ts) {
  5. coll.addAll(t);
  6. }
  7. }

8.6.5 不能实例化类型变量

  1. public Pair() {
  2. first = new T(); // ERROR
  3. second = new T(); // ERROR
  4. }

8.6.6 不能构造泛型数组

image.png

8.6.7 泛型类的静态上下文中类型变量无效

image.png

8.6.8 不能抛出或捕获泛型类的实例

同时不能扩展 Throwable:

image.png

catch 中不能使用类型变量:

image.png

在异常规范中可以使用类型变量:

image.png

上面截图, 书中的代码没写明白.

8.6.9 可以取消对检查型异常的检查

image.png

8.6.10 注意擦除后的冲突