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

在Java中,Map接口定义为,

public interface Map { ... V get(Object key); ... } 

为什么不?

 V get(K key); 

我只是碰到了一个讨厌的bug,因为使用了错误的类型键。 我认为generics的目的是在编译期间尽早捕获类型错误。 这会失败那个目的吗?

Kevin Bourrillion刚才在博客上发表了这篇文章 。 概要:

统一地,Java Collections Framework(以及Google Collections Library)的方法从不限制其参数的类型,除非必须防止集合被破坏。

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

一种类型的对象可以是.equals()到另一种类型的对象。 get()只要求你给它的对象是.equals()你得到的键

要添加到@subtenante,Java的设计使Java始终向后兼容。 generics不允许使用错误的类型,因为这不会破坏向后兼容性。 确保使用正确密钥的简单方法是执行此操作。

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

问题解决了。
对generics的另一个警告是,任何一个class级的孩子也可以被放入一个集合中。

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

这可能会导致一些大错!