【发布时间】:2020-02-08 16:44:17
【问题描述】:
我正在查看 java 中的 Arrays 类,发现以下代码中使用了 @SuppressWarnings("unchecked") 注释。
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;
}
您将如何重构以下代码以删除 @SuppressWarnings("unchecked") 注释?
【问题讨论】:
-
你不能,because you can't create array of generic type in java。所以你必须进行类型转换。
-
@AdwaitKumar 但我们确实知道
T[]的运行时类型。问题是没有带有适当签名的Array.newInstance。 -
@TomHawtin-tackline 问题不是
Array.newInstance(Class<?>, int)的签名,而是它的返回类型。声明返回Object以适应元素类型是原始类型的情况,因此数组类型不是Object[]的子类型。 -
是的,签名是错误的术语。我的意思是包括返回类型,
componentType的类型,它是length版本而不是dimensions(它有另一个理由不返回T[])。也许 签名 更好。