3

我刚刚通过 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的方法签名。

4

2 回答 2

3

这是因为 a 的键Map最终是 a Set; 并且 aMap包含给定键的值,如果它Set的键contains()是查询的值...

...您会注意到,从contains()上面链接的方法的原型中,该方法的参数是Object! 这是可以理解的;例如,Setwill 的某些实现依赖于.equals()(其参数是 an Object),而其他一些实现依赖于参数 implementation Comparable。这两种可能的实现没有比Object......

作为进一步的指示,您会注意到 aMapkeySet()名字是真实的:它返回一个Set...

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

于 2013-06-30T02:56:57.113 回答
0

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

于 2013-06-30T03:05:27.700 回答