2010-08-12 19 views
2

Java中的泛型有時會很嘈雜。在編譯之後,編譯器會拋出參數化類型,所以我的問題是,只要我聲明引用的類型包含參數化類型,是否存在忽略它們的任何缺點?例如,是否有任何理由我不應該忽略具體類型中的泛型類型?

Map<String, Map<Integer, String>> myMap = new HashMap<String, Map<Integer,String>>(); 

太吵了。如果我寫什麼:

@SuppressWarnings("unchecked") 
Map<String, Map<Integer, String>> myMap = new HashMap(); 

它是如此的清楚得多,但Eclipse會放一個噁心的波浪線下它。把@SuppressWarning放在Eclipse中會讓人開心,但很多人(包括我)不喜歡在代碼中加入@SuppressWarning。在「new HashMap()」中忽略類型參數真的很糟糕嗎?

回答

2

我認爲有編譯器警告但忽略它們會使它們無用。從理論上講,supresswarnings是好的,但它可能會被濫用,所以它可能是一個壞習慣。這將是固定在Java 7,在句法將是:

Map<String, Map<Integer, String>> map = new HashMap<>(); 

在此之前,谷歌收集它會爲你,但實在是太簡單的事自己獲得這個原因庫:

public static <K, V> HashMap<K, V> newHashMap() { 
    return new HashMap<K, V>(); 
} 
7

谷歌收藏搶救!

使用Maps.newHashMap - >

import com.google.common.collect.Maps; 
Map<X, Map<Y, Z>> myAwesomeMap = Maps.newHashMap(); 
+0

是的我知道Guava庫,但我只是想知道在「new HashMap」之後顯式鍵入參數化類型有什麼好處,或者不這樣做的危害是什麼。 – EnToutCas 2010-08-12 20:38:25

+0

我認爲這與OP所問的完全一樣,但是? – 2010-08-12 20:38:27

+1

好評,但對我來說這不是問題的答案。 – 2010-08-12 20:38:31

1

我認爲在這種情況下,你的罰款。您別無選擇,只能在該行後面提到myMap作爲Map<String, Map<Integer, String>>,因此保留了類型安全性。您正確地注意到,類型參數純粹是一個編譯時構造,所以您只需擔心編譯時不應該這樣做。你仍然在接受泛型的好處,所以我沒有看到一個問題(除了醜陋的註釋)。

Google Collections還提供避免在創建集合時重寫類型參數的方法。

4

如果你能忍受這個警告,那真的不是問題。

Java 7 will support generic type inference對於類似於您的示例的情況,所以這些警告將消失。不要壓制警告,因爲這可能掩蓋真正的錯誤—您認爲被簡單類型推斷覆蓋的情況,但編譯器知道更好。

相關問題