为什么Map.containsKey()采用Object参数而不是speciallized类型?

cha*_*nce 7 java generics map

可能重复:
Map.get(Object key)不是(完全)泛型Java Generics 的原因是什么
:为什么Map.get()忽略类型?

Java Map接口声明如下:

Interface Map<K,V>
Run Code Online (Sandbox Code Playgroud)

它有这样一种方法:

boolean containsKey(Object key)
Run Code Online (Sandbox Code Playgroud)

为什么不 boolean containsKey(K key)呢?

相反,List接口有add方法,它接受泛型类型的参数而不是Object:

boolean add(E e).
Run Code Online (Sandbox Code Playgroud)

rat*_*eak 4

这与不能向 a 添加任何内容的原因相同List<? extends E>,因为编译器无法保证类型安全(并且类型擦除使运行时检查变得不可能)。

这意味着当您收到 a 时,Map<? extends K,V>您将无法调用contains(K)它。然而,这contains已经足够普遍了,Object向它传递 random 不会损坏接口(但会使一些错误更难以发现)。