在Java中为什么Arrays.copyOf源代码有时会使用反射?

时间:2012-03-15 10:19:04

标签: java

我无法理解openjdk中java.util.Arrays中的这段代码。我很好奇为什么这段代码使用反射(Array.newInstance)以及它为什么检查类型是否相同?为什么它不能只做T [] copy =(T [])new Object [newLength],即使T和U类型不同?

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    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;
}

2 个答案:

答案 0 :(得分:4)

可以 - 但即使您要求Object[],您最终也会得到String[]。所以这个应该失败:

String[] strings = Arrays.copyOf(existingArray, 10, String[].class);
Object[] objects = strings;
objects = new Object();

...但如果Array.copyOf总是实际返回Object[],那么就不会

答案 1 :(得分:0)

您无法从像new T[newLength]这样的泛型类型实例化数组。所以你所能做的就是new Object[newLength]。但Arrays确实存储了有关项类型的信息,以便能够抛出ArrayStoreException,在这种情况下会丢失。