【问题标题】:Why don't HashMap.containsKey method constraint parameter types? [duplicate]为什么 HashMap.containsKey 方法不约束参数类型? [复制]
【发布时间】:2014-03-19 05:08:35
【问题描述】:

我不知道为什么我可以将任何类型的值传递给 HashMap.containsKey() 方法。我假设这个方法是HashMap Class 的实例方法(如果我错了,请纠正我),它应该受到泛型类型的限制。如果JAVA不想约束它,为什么HashMap.put()方法需要匹配它参数化的类型...

    HashMap<String, String> map = new HashMap<String, String>();
    // invalid
    // map1.put(1, "a");

我不能将int 值键放入我的HashMap map 具有String 的键类型。 containsKey()put() 方法有什么不同?

public static void main(String[] args) {
    HashMap<String, String> map1 = new HashMap<String, String>();
    map1.put("1", "a");
    map1.put("2", "b");
    map1.put("3", "c");
    if (map1.containsKey(1)) {
        System.out.println("contain");
    }
    else {
        System.out.println("not contain");
    }
}

在上面的代码中,输出了not contain,编译器没有反对。如果是这样,它将防止这种错误发生!我对吗?如果不是,请引导我了解真相。
感谢您阅读我的问题!

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    答案围绕着 PECS,我解释了一个概念 here

    简而言之,对于Map&lt;?, ?&gt;,我不能使用泛型参数调用Map.containsKey(K),即使它在技术上不是消费者方法。通过将其设为Map.containsKey(Object),无论类型是什么,我都可以调用containsKey,这在通配符绑定的地图中很有用。

    【讨论】:

      【解决方案2】:

      您会注意到在Javadoc for HashMap Map.containsKey()Object 作为其参数。该类是在泛型之前的 Java 1.2 中添加的,当泛型在 1.5 中添加时,方法签名没有更改。

      这意味着当你这样做时:

      if (map1.containsKey(1)) {
      

      1 自动装箱为 Integer 对象。然后在键查找期间,为该Integer 对象调用hashcode() 方法,以查看它是否存在于Map 中。而且......它没有。

      您需要将 int 转换为 String 以使其在您的 Map&lt;String,String&gt; 下正常工作:

      if (map1.containsKey(String.valueOf(1)) {
      

      【讨论】:

      • 这不是真的。如果是这样,他们为什么要在Map界面中将get(Object)更改为get(K)
      • @Brian 重新阅读我最初写的内容:泛型你是对的。我想我真的打算输入类而不是接口,但即使这样也可能不完全准确。但因为这首先不是答案的重要部分......已编辑。
      【解决方案3】:

      containsKey 方法具有以下签名:

      public boolean containsKey(Object key).

      因此,当您将 int 传递给它时,它会使用参数的 equals 方法来确定相等性。 由于您的密钥是 Strings ,因此 "1".equals(1) 返回 false。

      【讨论】:

      • 你能描述一下containsKey方法的简要代码吗?请..
      • @brian roach 对此的回答比我的解释更好。
      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多