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