java - 奇怪的 java 类型行为

标签 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) 中设置内容的整个键入。任何人都可以阐明这一点吗?这是预期的行为吗?

最佳答案

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

关于java - 奇怪的 java 类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766269/

相关文章:

java.lang.UnsupportedClassVersionError - 不同版本的 JDK 和 JRE

java - 带有字符串和int的xml android studio如何将int读取为字符串

java - android gradle -- 编译两个纯java项目到dex

java - 如何使用公钥/私钥对加密 SSO token ?

java - HTTP 状态 404 Apache Tomcat 错误 Spring MVC Java?

java - Spring JPA "And"方法且不为空

java - 是否有任何数学实用方法可以计算以下表达式?

java - 在tomcat 6上部署spring应用程序时出现异常

java - 如何在 SWT 应用程序中停止自定义 Thead?

java - 使用 log4j.xml 时出现 log4j 警告消息