首页 文章

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

提问于
浏览
7

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

Java Map接口声明如下:

Interface Map<K,V>

它有这样一种方法:

boolean containsKey(Object key)

为什么不 boolean containsKey(K key)

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

boolean add(E e).

2 回答

  • 0

    它's the same reason why you can' t添加任何东西到 List<? extends E> 因为编译器不能保证类型安全(并且类型擦除使得运行时检查不可能) .

    这意味着当你得到 Map<? extends K,V> 时,你将无法调用 contains(K) . 然而 contains 足够通用,将随机 Object 传递给它不会损坏接口(但会使一些错误更难以接收) .

  • 2

    接口在操作方式上是一致的,尽管我不能给出最初的原因 .

    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,插入操作采用泛型类型 .

相关问题