这是我的代码,我想知道它是如何可能的:
HashMap<Integer,String> hashmap = new HashMap();
hashmap.put(1,"milind");
hashmap.put(2,"nelay");
HashMap hash = new HashMap();
hash.put("piyush",1);
hashmap.putAll(hash);
for (Object name: hashmap.keySet()) {
Object key = name.toString();
Object value = hashmap.get(name);
System.out.println(key + " " + value);
}
这是输出:
1 milind
2 nelay
piyush 1
答案 0 :(得分:2)
您的hashmap
实际上没有指定键/值的类型,因此对于键和值,对象类型(或子类型包括整数,字符串和任何其他)都是可接受的。
这是你的第一行:
HashMap hashmap = new HashMap();
如果您将此行更改为:
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
继续下一行:
HashMap hash = new HashMap();
hash.put("piyush", 1);
hashmap.putAll(hash);
然后它不会编译。
答案 1 :(得分:1)
您的HashMaps不是类型安全的。 以下内容将不再编译:
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
hashmap.put(1, "milind");
hashmap.put(2, "nelay");
HashMap<String, Integer> hash = new HashMap<String, Integer>();
hash.put("piyush", 1);
hashmap.putAll(hash); // will not compile
for (Object name : hashmap.keySet()) {
Object key = name.toString();
Object value = hashmap.get(name);
System.out.println(key + " " + value);
}
答案 2 :(得分:0)
泛型类型参数(如<Integer, String>
)添加了一些编译时检查。否则, HashMap 可以包含任何内容。
由于第二个映射HashMap hash=new HashMap();
没有类型参数,因此它会通过void putAll(Map<? extends K,? extends V> m)
的编译器检查。然后,它可以在运行时很好地工作。
然而,地图的调用者将有一个非常困难的任务来处理意外类型的对象。这是您在编译器级别上修复它的方法:
private static void foo() {
HashMap<Integer,String> hashmap=new HashMap<>(); // diamond syntax to specify right-hand type
hashmap.put(1,"milind");
hashmap.put(2,"nelay");
HashMap<String, Integer> hash=new HashMap<>(); // diamond syntax again
hash.put("piyush",1);
hashmap.putAll(hash); // compile error
for (Object name: hashmap.keySet())
{
Object key =name.toString();
Object value = hashmap.get(name);
System.out.println(key + " " + value);
}
}