泛型实例化
来源:2-7 动态数组
qq_愿得一人心_28
2020-01-08
构造函数使用 data = (E[]) new Object[initialCapacity];对E[] 进行实例化,但是实际上得到的data并不是我们构造的时候传入的泛型,比如我:
Array<Integer> array = new Array<>(10);
for (int i = 0; i < 10; i++) {
array.add(Integer.parseInt(i + ""));
}
在Array里面的data并不是真正的Integer[] data,而是Object[] data。这样我需要将Array再转数组的时候就会出现转化错误,如:
/**
* @deprecated replace with {@link Array#toNormalArray(Object[])}
* 得到得是E其实是Object,会出现强制转化错误
* eg:
* Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
* */
public E[] toNormalArray2(){
E[] es= (E[]) new Object[size];
System.arraycopy(data, 0, es, 0, size);
return es;
}
编译的时候感觉能正常得到E[]数组的,但是实际上会出现Object转Integer的下转型失败问题。ArrayList的写法是:
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
这么做我在调用之前先要生成一个数组,我生成数组的时候又要先查一遍数组的长度,这样感觉封装性又很差,有什么办法能做到类似上面toNormalArray2这样使用无参的方法实现Array转出一个数组呢?
写回答
1回答
-
没有办法。这是 Java 泛型实现的一个遗留问题。简单来说就是:无法优雅地获得一个泛型数组。
继续加油!:)
112020-01-09
相似问题
泛型数组无法进行比较
回答 1
适用泛型-如何规范add的数据类型
回答 1