我无法理解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;
}
答案 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,在这种情况下会丢失。