2012-07-04 104 views
0

我有一個泛型類型的實例化一個代碼片段如下:警告中實例化一個泛型類型

public class GenericMessageMapper<I ,X> 
{ 
    public X xFromI(I imf) 
    { 
     // do thing by imf argument 
     Class<X> clazz = (Class<X>)((ParameterizedType) 
            this.getClass() 
             .getGenericSuperclass()) 
             .getActualTypeArguments()[1]; 
     X x = clazz.newInstance(); 
    } 
} 

上面的代碼工作得很好,但MyEclipse顯示的代碼(下線上的黃色準備clazz警告變線)此消息:Type safety: Unchecked cast from Type to Class<X>

我以下標註臨時加載在上述的方法xFromI

@SuppressWarnings("unchecked") 

這個警告的原因是什麼?解決方案是什麼?

回答

1

ftom2是正確的 - 在通常情況下,你應該執行如果出現此警告,請在施放投影之前進行實例檢查(instanceof)。但在你的情況下,這是不可能的,因爲Java中的泛型是通過擦除來實現的。 Class<X>不是實體類型,所以它不可能用於例如檢查,只有關閉警告的方法是使用@SuppressWarnings(value = "unchecked")。 要了解有關泛型的更多信息,可以使用this書。

1

它只意味着類的類型只在運行時才知道,所以可能會出現這樣的情況,您認爲您應該獲得類型X的類,但實際上它是其他類型的類(它不知道它在編譯時間,因爲X可以是任何類型)。

基本上你可以忽略這個警告。

2

警告就是這樣。一個警告。有時候警告是無關緊要的,有時它們不是。他們習慣於把注意力放在編譯器認爲可能成爲問題的東西上,但可能不是。

對於劇組,在這種情況下總是會發出警告。如果你是絕對肯定的是,特定的廣播將是安全的,那麼你應該考慮只前行加入這樣的註釋:

@SuppressWarnings (value="unchecked") 

參考Type safety: Unchecked cast