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

在Java中,为什么Arrays.copyOf源代码有时使用反射?,java,Java,我在理解openjdk中java.util.Arrays中的这段代码时遇到困难。我很好奇为什么这段代码使用反射(Array.newInstance),为什么它会检查类型是否相同?为什么即使t和U的类型不同,它也不能只执行t[]copy=(t[])new Object[newLength] public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {

我在理解openjdk中java.util.Arrays中的这段代码时遇到困难。我很好奇为什么这段代码使用反射(Array.newInstance),为什么它会检查类型是否相同?为什么即使t和U的类型不同,它也不能只执行t[]copy=(t[])new Object[newLength]

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;
}
public static T[]copyOf(U[]original,int newLength,Class它可以-但是,即使您要求提供一个
字符串[]
,您最终也会得到一个
对象[]
。因此这应该失败:

…但是如果
Array.copyOf
始终实际返回一个
对象[]

它可以-但是,即使您请求一个
字符串[]
,您最终也会得到一个
对象[]
。因此这应该失败:


…但如果
Array.copyOf
始终实际返回一个
对象[]

您不能从这样的泛型类型实例化数组
new t[newLength]
。因此您所能做的就是
新建对象[newLength]
。但是数组确实存储了关于项类型的信息,以便能够抛出ArrayStoreException,在这种情况下,它将丢失。

您不能从这样的泛型类型实例化数组
new T[newLength]
。因此您所能做的就是
新建对象[newLength]
。但是数组确实存储了关于项目类型的信息,以便能够抛出ArrayStoreException,在这种情况下,它将丢失。

为什么您认为
Array.newInstance
是反射?AIUI它只是一个“正常”的方法来构造一个参数化类的数组。@Andrzej这个类是
java.lang.reflect
包的一部分,我认为这是他假设反射的一个很好的理由。它实际上是一个本地方法,可能是一些JVM内部函数。@Voo Touché,我以前从未注意到它的包(该死的带有自动导入的IDE使一切变得简单…:)。你为什么认为
Array.newInstance
是反射?哎哟,这只是“正常的”方法来构造一个参数化类的数组。@Andrzej这个类是
java.lang.reflect
包的一部分,我认为这是他假设反射的一个很好的理由。它实际上是一个本地方法,可能是一些JVM内部函数。@Voo Touché,我以前从未注意到它的包(添加了自动导入的IDE使一切变得简单…:)。即使
new T[]
也与规范不匹配。即使
new T[]
也与规范不匹配。键入:您应该在最后一行中为
对象的某个索引赋值,例如
对象[0]=new Object()
typo:您应该在最后一行中为
对象的某些索引赋值,例如
对象[0]=new Object();
String[] strings = Arrays.copyOf(existingArray, 10, String[].class);
Object[] objects = strings;
objects = new Object();