在java中向下投射数组(删除未选中的警告游戏)

在java中向下投射数组(删除未选中的警告游戏),java,arrays,generics,Java,Arrays,Generics,我有一个愚蠢的问题,但有时你不得不问他们 我左手拿着一个Object[]实例(它来自非泛型swing),右手拿着一个方法,该方法接受一个比方说整数[]作为它的参数(在我的例子中,它实际上是一个vararg)。我确信数组的内容(如果我错了,我准备付出代价) 所以基本上我是这样写的: private static <U, T extends U> T[] cast(final U[] input, final Class<T> newType) { //noinspe

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

我左手拿着一个Object[]实例(它来自非泛型swing),右手拿着一个方法,该方法接受一个比方说整数[]作为它的参数(在我的例子中,它实际上是一个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;
}
private static T[]cast(最终U[]input,最终类newType){
//未检查
最终的T[]结果=(T[])Array.newInstance(newType,input.length);
System.arraycopy(输入,0,结果,0,输入.长度);
返回结果;
}
您是否可以在不拔下插头的情况下删除未选中的警告


为什么Array.newInstance()还没有被泛化?

简而言之:将其置于方法之上以抑制警告:

@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];
}
Object[]a=新对象[1];
整数b=1;
a[0]=b;
整数[]c=新整数[a.length];
for(int i=0;i
为什么Array.newInstance()没有被泛化

它可能与仅为引用类型实现的泛型相关
Array.newInstance(int.class,42)
是完全合法的,
class
不是。有了这个限制,就没有一种向后兼容的方法使它成为泛型

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;
}
私有静态T[]转换(最终U[]输入,最终T[]原型){
最终T[]结果=Arrays.copyOf(原型,输入.length);
System.arraycopy(输入,0,结果,0,输入.长度);
返回结果;
}

如果您不介意传入一个空数组而不是类对象,那么它可以避免强制转换。

我想这并不是我想要得到的答案。此外,在我的实际代码中,直接位于语句上方的是//未选中的noinspection。+1。我不确定“//noinspection”是什么(一些特定于想法的东西?),但是
@SuppressWarnings(“unchecked”)
是抑制未检查警告的正确方法。Java数组不是泛化的;您将无法以任何其他方式执行此操作。可能有人发现了一个功能,可以简单地将警告推送到JDK中?我找不到任何好的理由让Array.newInstance()以它现在的方式而不是t[]newInstance(类elemType,int lenght)进行类型化。我认为您的基本类型注释是一个好的注释!我还没想过。