我刚刚通过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.
答案 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。