在Java中,Map接口的定義是,Java泛型:爲什麼Map.get()忽略類型?
public interface Map<K,V> {
...
V get(Object key);
...
}
爲什麼不呢?
V get(K key);
我剛碰到一個討厭的錯誤,因爲使用了錯誤的類型鍵。我認爲泛型的目的是在編譯期間儘早捕獲類型錯誤。這是否打破了這個目的?
在Java中,Map接口的定義是,Java泛型:爲什麼Map.get()忽略類型?
public interface Map<K,V> {
...
V get(Object key);
...
}
爲什麼不呢?
V get(K key);
我剛碰到一個討厭的錯誤,因爲使用了錯誤的類型鍵。我認爲泛型的目的是在編譯期間儘早捕獲類型錯誤。這是否打破了這個目的?
Kevin Bourrillion blogged about this前一陣子。摘要:
均勻,在Java 集合框架(和谷歌 收藏圖書館太)從未 限制類型的參數 除非有必要防止 從得到打破了收集的方法。
就我個人而言,我不是那種方法的粉絲,但考慮到也採取了差異方法,它確實有些道理。
要添加到@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)
.....
這可能會導致一些大錯誤!
我真的看不到擦除進入這個地方。擦除應該只是一個問題,如果你正在做一些「不安全」的事情。 –
Put()使用泛型類型。我只是抱怨得到。 –
@ZZ編碼器,我解決了第一組代碼中的問題,第二組代碼指出了另一個常見問題,一些使用泛型 – WolfmanDragon
一種類型的對象可以是.equals()
另一種類型的對象。 get()
只要求你給它的對象是.equals()
就是你要得到的密鑰
這是不正確的。我得到ClassCastException,所以類型必須匹配。 –
如果你得到一個ClassCastException,那麼equals()執行的很差。如果類型不兼容則返回false是一個更好的主意。 – finnw
一些很好的答案可以在這裏找到:[爲什麼Map.get(Object key)不是(完全)泛型]的原因是什麼? http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic) – NickDK