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

时间:2011-12-08 16:22:38

标签: java generics map

  

可能重复:
  What are the reasons why Map.get(Object key) is not (fully) generic
  Java Generics: Why Does Map.get() Ignore Type?

Java Map接口声明如下:

Interface Map<K,V>

它有这样一种方法:

boolean containsKey(Object key)

为什么不呢  boolean containsKey(K key)

相反,List接口的add方法采用泛型类型的参数而不是Object

boolean add(E e).

2 个答案:

答案 0 :(得分:2)

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

这意味着当您获得Map<? extends K,V>时,您将无法在其上调用contains(K)。但是contains足够通用,将随机Object传递给它不会损坏界面(但会使一些错误更难以获取)。

答案 1 :(得分:0)

界面在操作方式上是一致的,但我无法给出最初的原因。

Interface Map<K,V>
    boolean containsKey(Object key)
    V put(K key, V value)

Interface List<E>
    boolean contains(Object o)
    boolean add(E e)

在这两种情况下,contains方法都使用Objects,插入操作采用泛型类型。