2009-09-21 59 views
9

在Java中,Map接口的定義是,Java泛型:爲什麼Map.get()忽略類型?

public interface Map<K,V> { 
    ... 
    V get(Object key); 
    ... 
} 

爲什麼不呢?

V get(K key); 

我剛碰到一個討厭的錯誤,因爲使用了錯誤的類型鍵。我認爲泛型的目的是在編譯期間儘早捕獲類型錯誤。這是否打破了這個目的?

+0

一些很好的答案可以在這裏找到:[爲什麼Map.get(Object key)不是(完全)泛型]的原因是什麼? http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic) – NickDK

回答

9

Kevin Bourrillion blogged about this前一陣子。摘要:

均勻,在Java 集合框架(和谷歌 收藏圖書館太)從未 限制類型的參數 除非有必要防止 從得到打破了收集的方法。

就我個人而言,我不是那種方法的粉絲,但考慮到也採取了差異方法,它確實有些道理。

-3

要添加到@subtenante,Java的設計必須使Java始終向後兼容。泛型不允許放錯類型,因爲這不會破壞向後兼容性。確保正確使用鑰匙的簡單方法是執行此操作。

K key = null; 
V value = null; 

Map<K,V> mapped = new HashMap<K,V>() 
.......//set the key and value.......... 
mapped.put(key, value) 
..... 
V var = mapped.get(key); 

問題已解決。
對泛型還有一個警告,任何一個班級的孩子也可以放入一個集合中。

Number k= null; 
Number v= null; 

Map<Number,Number> mapped = new HashMap<Number,Number>() 
.......//set the key and value.......... 
k = double someDouble; 
v = int someInt; 
mapped.put(k, v) 
..... 

這可能會導致一些大錯誤!

+0

我真的看不到擦除進入這個地方。擦除應該只是一個問題,如果你正在做一些「不安全」的事情。 –

+0

Put()使用泛型類型。我只是抱怨得到。 –

+0

@ZZ編碼器,我解決了第一組代碼中的問題,第二組代碼指出了另一個常見問題,一些使用泛型 – WolfmanDragon

3

一種類型的對象可以是.equals()另一種類型的對象。 get()只要求你給它的對象是.equals()就是你要得到的密鑰

+0

這是不正確的。我得到ClassCastException,所以類型必須匹配。 –

+7

如果你得到一個ClassCastException,那麼equals()執行的很差。如果類型不兼容則返回false是一個更好的主意。 – finnw