2014-03-31 92 views
0

我看到一些行为,我不明白在泛型类型的Map.entrySet。如果我遍历一个类型化的地图,我会得到预期的类型,例如奇怪的java类型的行为

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. 

我不应该能够得到一个无类型条目的声明一个)?如果我看在JVM中的HashMap的实现中,我看到:

c) public Set<Map.Entry<K,V>> entrySet() { ... 

这种行为似乎暗示,由于K,没有在第二个例子中指定的V,在设置内容不知何故整个打字c)被省略。任何人都可以对此有所了解吗?这是预期的行为?

+0

看看[这个问题](http://stackoverflow.com/q/22744197/1679863) –

+0

如果有一件事是生的,其他一切都变成生的;它不仅仅被视为“对象”。 (这就是为什么你从不在新代码中使用rawtypes的原因。) –

回答

3

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

+0

我明白了,但看起来违反直觉的是,删除给你的是对象而不是无类型的Map.Entry,因为无类型映射有足够的信息来确定它是否返回(未定义类型)Map.Entry值。 –