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

Alb*_*ert 7 java casting variadic-functions

可能重复:
是否可以解决"为varargs参数创建T的通用数组"编译器警告?

考虑到这一点:

interface A<T> { /*...*/ }
interface B<T> extends A<T> { /*...*/ }
class C { /*...*/ }
void foo(A<T>... a) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

现在,其他一些代码想要使用foo:

B<C> b1 /* = ... */;
B<C> b2 /* = ... */;
foo(b1, b2);
Run Code Online (Sandbox Code Playgroud)

这给了我警告

Type safety : A generic array of A is created for a varargs parameter
Run Code Online (Sandbox Code Playgroud)

所以我改变了对此的调用:

foo((A<C>) b1, (A<C>) b2);
Run Code Online (Sandbox Code Playgroud)

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

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

Col*_*inD 15

你所能做的就是用这个警告来抑制这个警告@SuppressWarnings("unchecked").Java 7将消除对客户端代码的警告,将其移至声明foo(A... a)而不是调用站点.请参阅此处的项目投币建议.

  • 上面提到的Project Coin功能现已推出 - 请参阅Java 7中的[@SafeVarargs](http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html). (3认同)

Ber*_*t F 5

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

我认为A必须是通用的才能获得该错误.在您的项目中是一个通用的,但上面的代码示例将通用的decl退出?

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

Java泛型和varargs