【问题标题】:Method Signatures in Generic Map Interface通用映射接口中的方法签名
【发布时间】:2013-06-30 02:21:17
【问题描述】:

我刚刚通过 Oracle Docs TutorialTutorial 学习了 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。

【问题讨论】:

  • @MattBall 不同意;事实上,答案比链接问题所解释的要明显得多
  • @fge 你不同意这个问题是重复的吗? ...真的吗?

标签: java generics collections map


【解决方案1】:

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

...您会注意到,从上面链接的contains() 方法的原型中,该方法的参数是Object!这是可以理解的;例如,Set 的一些实现将依赖于.equals()(其参数是Object),而其他一些实现依赖于实现Comparable 的参数。这两种可能的实现没有比Object 更常见的“低级类型”...

作为进一步的指示,您会注意到 MapkeySet() 与其名称相符:它返回一个 Set...

(出于好奇,如果您深入研究代码,您会注意到 HashSet 实际上是 HashMap;只是您无法访问地图的值。A最终,HashSet 的使用成本很高!)

【讨论】:

  • 正如我在其他评论中所说,Comparablecontains 等的合同无关。
【解决方案2】:

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

【讨论】:

  • 部分解释;考虑SortedSet
  • @fge 不是。订购(基于Comparable 或指定的Comparator)只是一个附加合同,始终需要与equals 保持一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多