泛型实例化

来源: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回答

liuyubobobo

2020-01-09

没有办法。这是 Java 泛型实现的一个遗留问题。简单来说就是:无法优雅地获得一个泛型数组。


继续加油!:)

1
1
qq_愿得一人心_28
非常感谢!
2020-01-09
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程