2014-03-19 103 views
-1

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

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

型我不能把int价值关键我HashMapmap具有密钥类型StringcontainsKey()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,编译器没有反对。如果是这样,它会防止发生这种错误!我对吗?如果没有,请引导我说实话。
感谢您阅读我的问题!

回答

0

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

这意味着,当你做:

if (map1.containsKey(1)) { 

1被autoboxed到Integer对象。然后在密钥查找过程中,对该Integer对象调用hashcode()方法来查看它是否存在于Map中。而且......它没有。

您将需要转换的是intString正确地给出了它的工作你Map<String,String>

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

这是不正确的。如果是这种情况,他们为什么要在'Map'接口中将'get(Object)'改成'get(K)'? – Brian

+0

@Brian重读我最初写的东西:泛型,你是对的。我认为我真的打算输入类而不是接口,但即使这可能不完全准确。但是,因为这并不是真正的答案的重要部分...编辑。 –

2

答案围绕PECS展开,这个概念我解释为here

小故事是Map<?, ?>,我不能用泛型参数调用Map.containsKey(K),即使它在技术上不是消费者方法。通过将它设为Map.containsKey(Object),我可以拨打containsKey,不管类型是什么,这在通配符绑定的地图中很有用。

-1

containsKey方法具有以下特征:

public boolean containsKey(Object key)

所以当你通过一个int,它使用参数的equals方法来确定相等性。 由于您的密钥是Strings,"1".equals(1)返回false。

+0

你能描述我'containsKey'方法的简单代码?请.. – Cataclysm

+0

@brian roach的答案比我的这个更好的解释。 –

相关问题