Java Generics:为什么Map.get()忽略类型?

时间:2009-09-21 15:32:34

标签: java generics

在Java中,Map接口定义为

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

为什么不呢?

V get(K key);

我刚碰到一个讨厌的错误,因为使用了错误的类型密钥。我认为泛型的目的是在编译期间尽早捕获类型错误。这会破坏这个目的吗?

3 个答案:

答案 0 :(得分:9)

Kevin Bourrillion blogged about this前一段时间。总结:

  

统一,Java的方法   收藏框架(和谷歌   收藏图书馆也没有   限制其参数的类型   除非有必要预防   收集破碎。

就我个人而言,我不是那种方法的粉丝,但考虑到已采取的差异方法,它确实有一定意义。

答案 1 :(得分:3)

一种类型的对象可以是.equals()到另一种类型的对象。 get()只要求您提供的对象.equals()为您获得的密钥

答案 2 :(得分:-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)
.....

这可能会导致一些大错误!