2010-10-20 49 views
7

可能重複:
Is it possible to solve the 「A generic array of T is created for a varargs parameter」 compiler warning?的Java:類型安全:爲一個可變參數參數創建A的通用陣列

考慮這個給出:

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

這仍然給了我同樣的警告。

爲什麼?我該如何解決這個問題?

回答

14

所有你真正能做的就是用@SuppressWarnings("unchecked")壓制這個警告。 Java 7將消除客戶端代碼的警告,將其移至foo(A... a)的聲明,而不是呼叫站點。請參閱項目投幣建議here

+3

所提到的Coin項目功能現在 - 見[ @SafeVarargs](http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html)在Java 7中。 – 2012-07-17 14:46:47

5

編輯:答案更新,以反映該問題已更新,以顯示A確實是通用的。

我會認爲A必須是一個通用的,以獲得該錯誤。是一個在你的項目中的通用,但上面的代碼示例離開了通用的decl?

如果是這樣, 因爲A是通用的,你不能解決乾淨警告。可變參數使用實現的數組,這裏說明一個陣列不支持通用陣列:

Java generics and varargs

+0

是的。我想我太簡化了這個例子。會改變這一點。 – Albert 2010-10-20 19:48:41

0

你可以試試這個:

<T> void foo(T... a) { /*...*/ } 
相關問題