为什么不使用HashMap.containsKey方法约束参数类型?

时间:2014-03-19 05:08:36

标签: java hashmap

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

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

我无法将int值键添加到密钥类型为HashMap的{​​{1}} mapcontainsKey()put()方法之间有什么不同?

String

在上面的代码中,输出了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"); } } ,编译器没有对象。如果确实如此,那就可以防止这种错误发生!我对吗?如果没有,请指导我说实话。
感谢您阅读我的问题!

3 个答案:

答案 0 :(得分:2)

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

短篇小说是Map<?, ?>,我不能用通用参数调用Map.containsKey(K),即使它在技术上不是消费者方法。通过设置Map.containsKey(Object),无论类型是什么,我都可以调用containsKey,这在通配符绑定的地图中很有用。

答案 1 :(得分:1)

你会注意到Javadoc for HashMap Map.containsKey()Object为参数。在泛型之前,在Java 1.2中添加了该类,并且当在1.5中添加泛型时,方法签名未被更改。

这意味着当你这样做:

if (map1.containsKey(1)) {

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

您需要将int转换为String才能使Map<String,String>正常工作:

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

答案 2 :(得分:-1)

containsKey方法具有以下签名:

public boolean containsKey(Object key)

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