在java中向下转换数组(删除未经检查的警告游戏)

时间:2009-09-30 19:00:37

标签: java arrays generics

我有一个愚蠢的愚蠢问题,但有时你不得不问他们。

我的左手有一个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()没有被泛化?

2 个答案:

答案 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];
}