Java反射之创建泛型数组

前边介绍了Java泛型类设计体系中的一些常用类,本篇将着重介绍 Array 类和如何创建泛型数组。 1. Java能创建泛型数组吗? 1.1. 泛型类型擦除 首先,我们知道,泛型是JDK1.5推出的编译期特性,什么是编译期?即是说在编译的时候有效,编译代码时编译器能够对泛型进行检查和校验。但是如果在运行时,泛型其实已经无效了,泛型类型被擦除了。比如下面的代码: 代码清单1 List<String> stringList = new ArrayList<>(); List<Integer> integerList = new ArrayList<>(); System.out.println(stringList.getClass() == integerList.getClass()); 结果输出为 true。stringList 只能添加 String 类型的数据,而 integerList 也只能添加 Integer,不能加入别的类型的数据。为什么?因为它们申明了泛型类型,编译器就会对类型兼容性进行检查,类型不符则会抛出异常。但是,他们的 Class 确是相同的,即是说,在运行时它们是相同的类型,都是 ArrayList,而泛型类型被擦除了。 1.2. 尝试创建泛型数组 那么,我们申明泛型数组会怎么样呢?看下边的代码: 代码清单2 class GenericArray1<T> { private final T[] array; (1) private int index; public GenericArray1(int size) { this.array = (T[]) new Object[size]; (2) } public void add(T item) { (3) array[index++] = item; } public T[] array() { return array; } } 1 申明泛型数组成员域 2 构造函数中创建Object数组,然后强转为泛型类型 3 数组中只能添加特定类型的元素 上边的代码,试图创建一个泛型数组,它只能添加某一种类型的数据,然后通过 array() 方法返回这个数组。然而,标记3的 add 方法虽然得益于泛型实现了限制了数组中只能添加特定的某一类型元素,看似没有问题,实际上运行时标记2的这行代码会抛出 ClassCastException,告诉你Object数组不能转为特定类型的数组。创建了 Object 数组, 它可以容纳任何元素,但是如果强制转型为特定类型的数组,可容纳的元素类型范围变窄了,这不是向下转型吗?jvm不允许这么做。...

2021-11-10 · 3 min · 469 words · Hank