首页 > 解决方案 > toArray() 函数如何确保 long 类型的列表不能转换为 Integer 的数组

问题描述

    public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
    }        

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

不明白为什么函数 copyOf() 的第三个参数类型是Class<? extends T[]>而不是简单Class<T[]>的。他们之间有什么区别。这个约束是否确保一种类型的列表不能转换为另一种类型的数组。

标签: javagenerics

解决方案


通配符允许您传递非文字类。

例如:

copyOf(new String[0], 0, String[].class);
copyOf(new String[0], 0, new String[0].getClass());

Class<? extends T[]>当第三个参数类型为;时,这两个都有效。但只有第一个对Class<T[]>.

Ideone demo

实际上,这意味着您可以copyOf在编译时调用您不知道的类型;相反,您正在从现有数组中获取类。


推荐阅读