2015-07-12 50 views
1

由於引入的一般類型參數(或類型的參數)在Java中,寫在Eclipse IDE下面一行將顯示在類型Class黃色波浪線:我應該使用問號類型參數還是抑制rawtypes警告?

Class myClass; 

上的鼠標懸停所示的警告是以下兩種選擇(除其他外):

Class是原始類型。參考通用類型Class<T>應該參數化。

  • 添加類型參數的 'Class'
  • 添加@SuppressWarnings 'rawtypes' 到 'myClass'

第一種選擇產生這樣的代碼:

Class<?> myClass; 

第二個產生此:

@SuppressWarnings("rawtypes") 
Class myClass; 

上述兩個選項同樣適用於處理警告。

假設我們和Eclipse都不能推斷泛型類型參數*;採取什麼更好的方法,在什麼情況下,爲什麼?

*(儘管有該選項嘗試這樣做)

+1

那麼,你知道你要回歸什麼特定類型的'Class'對象嗎? – Makoto

+0

@Makoto Nope。沒有。 – ADTC

回答

2

的一般規則每個程序員都應該堅持:永遠不要抑制沒有充分的理由警告。如果您禁止發出警告,您應該知道警告發生的原因以及爲什麼它不會在您的案例中出現問題。

在這種情況下,以抑制rawtype警告將支持是寫在的時候,泛型在Java中不存在(見Java語言規範4.8)遺留代碼的原因:

使用的原始類型僅允許作爲遺留代碼的兼容性 的讓步。在編寫代碼後使用原始類型 將通用性引入到Java編程語言中是 強烈不鼓勵。未來版本的Java 編程語言可能會禁止使用原始類型。

所以它不適用於你的情況,你不應該壓制這個警告。

至於通配符?,這應該只用於如果你想分配不同類型的變量。

例如一個List<?> mylist可以存儲任何類型的列表中,而List<? extends Collection>可以存儲任何類型的,從Collection繼承存儲在列表中。一般規則應儘可能具體說明允許的類型。這樣,如果您不小心將對象添加到不適合它的List中,編譯器可以通知您sonner。

因此,最好的方法是考慮如何使用myClass變量,並且如果可以聲明它將保存哪種類型的對象,請使用該類型替換通配符。

相關問題