我在 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) 中设置内容的整个键入。任何人都可以阐明这一点吗?这是预期的行为吗?
最佳答案
entrySet
方法返回 Set<K, V>
。但是,当您为 HashMap
使用原始类型时,该类型中的所有泛型都会进行类型删除,并且 entrySet
方法只返回 Set
。迭代原始 Set
将产生Object
s。
关于java - 奇怪的 java 类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766269/