源码求解
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)这句话的作用是什么,为什么要做强制类型转换。
这段代码
(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[]
类型。