摆脱List <genericclass <t>&gt; .toArray()</genericclass <t>中的警告

时间:2010-12-13 23:18:59

标签: java warnings generics unchecked

另外一个我怎么做array()没有警告问题,但它与大多数发布在这里的不同。

如何重写方法实现(不更改方法签名)以使其在没有警告的情况下进行编译?

这里显而易见的困难是T的类信息在运行时期间不可用。但是,返回类型在运行时也是一种擦除类型,所以没有理由不这样做。那么,如果要强制执行编译时类型安全,我该怎么做呢?

谢谢

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) {
    return list.toArray(new GenericClass[0]);
}

2 个答案:

答案 0 :(得分:2)

你做不到。因为数组是协变的,所以对于持有参数化类型的数组,不可能具有编译时安全性。 (除非你使用&lt;?&gt;这是合法的。)

这永远是合法的:

GenericClass<String>[] array = new GenericClass[1];
Object[] brokenArray = array;
brokenArray[0] = new GenericClass<Integer>();
String value = array[0].getGenericValue(); //kaboom

编译器无法保护您,因此它会强制您确认/禁止发出警告。

答案 1 :(得分:1)

您可以添加@SuppressWarnings("unchecked")注释。这不会更改方法签名,并允许您在不生成警告的情况下执行“不安全”操作。您的代码真的很安全,因此可以取消警告。请注意,根据@Affe的回答,Bad Things可能会在您返回后发生,但您当然可以正确实施您的方法。

Java Collections框架在内部执行此类操作,因此它不仅仅是一个hack。嗯,它一个黑客,但它是一个好的黑客。嗯,这不是那么好,但它确实有效。有点。