源码求解
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;
}
请问,(Object)newType == (Object)Object[].class)这句话的作用是什么,为什么要做强制类型转换。
关于 LearnKu
这段代码
(Object)newType == (Object)Object[].class的作用是进行类型判断,判断给定的newType是否是Object[]类型。在Java中,由于泛型的类型擦除,是无法直接通过泛型类型参数
T来创建泛型数组。为了解决这个问题,通常会使用反射来创建泛型数组。在这个方法中,newType参数表示要创建的泛型数组的类型。这个语句做了以下几个事情:
(Object)newType强制将newType转换为Object类型,这样可以比较两个对象的引用是否相等。(Object)Object[].class强制将Object[].class转换为Object类型,同样是为了比较两个对象的引用是否相等。==操作符用于比较两个对象的引用是否相等,即判断两个对象是否是同一个对象。通过上述语句的比较操作,可以判断出
newType是否是Object[]类型。如果是Object[]类型,即表示泛型数组的类型参数是T[],这时可以使用(T[]) new Object[newLength]创建一个新的泛型数组。否则,需要使用Array.newInstance(newType.getComponentType(), newLength)通过反射创建一个指定类型的泛型数组。需要强制类型转换的原因是,Java编译器无法在编译时确定
newType到底是哪个具体的类型,而(Object)newType和(Object)Object[].class的强制类型转换可以使得两个对象的引用可以进行比较,通过比较两个对象的引用,判断newType是否是Object[]类型。