奇怪的java类型行为

时间:2014-03-31 15:53:05

标签: java

我在一般类型的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)中的设置内容的整个类型。任何人都可以对此有所了解吗?这是预期的行为吗?

1 个答案:

答案 0 :(得分:3)

entrySet方法返回Set<K, V>。但是,当您为HashMap使用原始类型时,类型中的所有泛型都会进行类型擦除,而entrySet方法只会返回Set。对原始Set进行迭代将产生Object s。