我有一个愚蠢的愚蠢问题,但有时你不得不问他们。
我的左手有一个Object []实例(它来自非泛型摇摆)和一个接受一个让我们说的Integer []作为其参数的方法(在我的例子中,它实际上是一个vararg)在我的右手。我确定阵列的内容(或者如果我错了,我准备付出代价)。
基本上我写的是:
private static <U, T extends U> T[] cast(final U[] input, final Class<T> newType) {
//noinspection unchecked
final T[] result = (T[]) Array.newInstance(newType, input.length);
System.arraycopy(input, 0, result, 0, input.length);
return result;
}
你可以删除未检查的警告,而不拔掉它吗?
为什么Array.newInstance()没有被泛化?
答案 0 :(得分:2)
为什么Array.newInstance()没有被泛化?
它可能与仅针对参考类型实现的泛型有关。 Array.newInstance( int.class, 42 )
完全合法,Class<int>
不是。由于存在这种限制,因此没有向后兼容的方式使其成为通用类型。
java.util.Arrays
类通过为每个基本类型提供多个重载来解决此问题。所以这有效:
private static <U, T extends U> T[] cast ( final U[] input, final T[] prototype ) {
final T[] result = Arrays.copyOf ( prototype, input.length );
System.arraycopy(input, 0, result, 0, input.length);
return result;
}
如果你不介意传入一个空数组而不是类对象,它就会避免强制转换。
答案 1 :(得分:0)
简短方法:将此方法置于方法上方以取消警告:
@SuppressWarnings("unchecked")
很长的路:循环并依次施放每个元素:
Object[] a = new Object[1];
Integer b=1;
a[0]=b;
Integer[] c = new Integer[a.length];
for(int i = 0; i < a.length; i++)
{
c[i] = (Integer) a[i];
}