Java:类型安全:为varargs参数创建A的通用数组

时间:2010-10-20 19:30:21

标签: java casting variadic-functions

  

可能重复:
  Is it possible to solve the “A generic array of T is created for a varargs parameter” compiler warning?

考虑到这一点:

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);

这仍然给了我同样的警告。

为什么呢?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:15)

你所能做的就是用@SuppressWarnings("unchecked")来抑制警告。 Java 7将消除对客户端代码的警告,将其移至foo(A... a)而不是呼叫站点的声明。请参阅项目投币提案here

答案 1 :(得分:5)

编辑:答案已更新,以反映该问题已更新,以显示A确实是通用的。

我认为A必须是通用的才能获得该错误。在您的项目中,A是通用的,但上面的代码示例会将通用的decl删除吗?

如果是这样,因为A是通用的,你无法干净地处理警告。 Varargs使用数组实现,数组不支持通用数组,如下所述:

Java generics and varargs

答案 2 :(得分:0)

你可以试试这个:

<T> void foo(T... a) { /*...*/ }