Java 6 Map.get()类型安全意外行为(?)

时间:2009-06-25 19:15:41

标签: java generics

  

可能重复:
  What are the reasons why Map.get(Object key) is not (fully) generic

根据Map接口的javadocs(http://java.sun.com/javase/6/docs/api/java/util/Map.html),get的定义是

  

V get(对象键)             返回指定键映射到的值,或者为null   如果此地图不包含任何映射   关键。

代码示例:

Map<InstrumentInfo, Double> moo = new HashMap<InstrumentInfo,Double>();
moo.get(new Integer(5));

我希望上面的代码会抛出异常或至少发出警告。

我希望通过泛型和类型安全性,get方法将接受类型的参数。接受Object类型的原因是什么?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

对于 Map&lt; Y get(对象键)的定义是 X,Y&gt; 并且Map.get将返回(key == null?k == null:key.equals(k),我希望它返回null,除非你的InstrumentInfo有重载.equals能够与整数进行比较。

为什么 Y得到(对象键)不是 Y得到(X键)我不知道,但我猜这与它有关向后兼容性问题。

答案 2 :(得分:0)

它只会返回null,因为地图永远不会包含密钥。

这就是为什么remove()来自Integer的{​​{1}}的原因相同 - 它在泛型之前有效,因此不会破坏旧代码。