考虑到这一点:
interface A<T> { /*...*/ }
interface B<T> extends A<T> { /*...*/ }
class C { /*...*/ }
void foo(A<T>... a) { /*...*/ }
现在,其他一些代码想要使用foo
:
B<C> b1 /* = ... */;
B<C> b2 /* = ... */;
foo(b1, b2);
这给了我警告
Type safety : A generic array of A is created for a varargs parameter
所以我改变了对此的调用:
foo((A<C>) b1, (A<C>) b2);
这仍然给了我同样的警告。
为什么呢?我该如何解决这个问题?
答案 0 :(得分:15)
你所能做的就是用@SuppressWarnings("unchecked")
来抑制警告。 Java 7将消除对客户端代码的警告,将其移至foo(A... a)
而不是呼叫站点的声明。请参阅项目投币提案here。
答案 1 :(得分:5)
编辑:答案已更新,以反映该问题已更新,以显示A确实是通用的。
我认为A必须是通用的才能获得该错误。在您的项目中,A是通用的,但上面的代码示例会将通用的decl删除吗?
如果是这样,因为A是通用的,你无法干净地处理警告。 Varargs使用数组实现,数组不支持通用数组,如下所述:
答案 2 :(得分:0)
你可以试试这个:
<T> void foo(T... a) { /*...*/ }