我在一般类型的Map.entrySet中看到了一些我不理解的行为。如果我遍历一个打字的地图,我会得到预期的类型,例如
HashMap<A,B> map = new HashMap<>();
for(Map.Entry<A,B> e: map.entrySet(){ ... }
但是,如果我有一个无类型的地图,则条目集的迭代类型将被报告为对象:
HashMap map = new HashMap();
a) for (Map.Entry e: map.entrySet(){ ... } // this will fail, e is being reported as "Object"
b) for (Object o: map.entrySet(){ ... } // this is compilable.
我不能在声明a)中获得无类型的条目吗?如果我查看jvm中的hashmap实现,我会看到:
c) public Set<Map.Entry<K,V>> entrySet() { ...
这种行为似乎意味着因为在第二个例子中未指定K,V,所以在某种程度上省略了c)中的设置内容的整个类型。任何人都可以对此有所了解吗?这是预期的行为吗?
答案 0 :(得分:3)
entrySet
方法返回Set<K, V>
。但是,当您为HashMap
使用原始类型时,类型中的所有泛型都会进行类型擦除,而entrySet
方法只会返回Set
。对原始Set
进行迭代将产生Object
s。