通用映射接口中的方法签名

时间:2013-06-30 02:21:17

标签: java generics collections map

我刚刚通过Oracle Docs Tutorial Tutorial研究了Java中的泛型。现在我转到了Collections Framework。我想知道如果Map接口是这样的通用

 public interface Map<K,V> {

    // Basic operations
    V put(K key, V value);
    V get(Object key);
    V remove(Object key);
    boolean containsKey(Object key);
//some more method declarations
}

我想知道为什么V get(Object key); V remove(Object key); boolean containsKey(Object key);的方法签名使用Object作为其参数而不是K.

2 个答案:

答案 0 :(得分:3)

这是因为Map的密钥最终是Set;并且Map包含给定密钥的值,如果其Set个密钥contains()是查询后的值...

...你会注意到,从上面链接的contains()方法的原型,这个方法的参数是Object!这是可以理解的;例如,Set的某些实现将依赖于.equals()(其参数为Object),其他一些实现依赖于实现Comparable的参数。这两种可能的实现与Object ...

之间没有共同的“低级类型”

作为进一步的指示,您会注意到Map的{​​{3}}与其名称相符:它返回Set ...

(出于纯粹的好奇心,如果你深入研究代码,你会注意到HashSet实际上是HashMap;只是你无法访问地图。最终使用HashSet是一件非常昂贵的事情!)

答案 1 :(得分:0)

Collection API中有一些解释 - ... Collections Framework接口中的许多方法都是用equals方法定义的...... 。 Object.equals不要求对象具有相同的类型。例如,ArrayList可以等于LinkedList。

相关问题