- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我发现 map 、原始类型和泛型会发生一些有趣的事情。以下代码:
static {
Map map = new HashMap ();
Set <Map.Entry> set = map.entrySet ();
for (Map.Entry entry : set) {} // fine
for (Map.Entry entry : map.entrySet()) {} // compilation error
}
我收到有关类型不兼容的编译错误,即:“对象无法转换为条目”。
如果没有变量再次存储它,为什么 entrySet()
上的迭代器会丢失类型信息?
原始类型不应影响类型,因此 Map.Entry
突然变成一个对象。还是我弄错了?
最佳答案
您的示例使您看起来拥有从未有过的类型信息。你写了:
Map map = new HashMap ();
Set <Map.Entry> set = map.entrySet();
for (Map.Entry entry : set) {} // fine
for (Map.Entry entry : map.entrySet()) {} // compilation error
但是map.entrySet()
正在返回 Set
, 不是 Set <Map.Entry>
.您执行了一项未经检查的作业,该作业“添加”了类型信息。
在第二个for循环中,我们不知道Set
里面有什么, 所以我们不能遍历 Set <Map.Entry>
没有明确的强制转换。
例如,将原始示例与我们不使用未经检查的赋值“添加”类型信息的示例进行比较。
Map map = new HashMap();
Set set = map.entrySet();
for (Map.Entry entry : set) {
} // Object cannot be cast to Entry
for (Map.Entry entry : map.entrySet()) {
} // Object cannot be cast to Entry
在这种情况下,两个 for 循环都会产生编译错误。
Java 语言规范第 4.8 节中记录了此行为:
The type of a constructor (§8.8), instance method (§8.8, §9.4), or non-static field (§8.3) M of a raw type C that is not inherited from its superclasses or superinterfaces is the erasure of its type in the generic declaration corresponding to C. The type of a static member of a raw type C is the same as its type in the generic declaration corresponding to C.
关于java - 为什么我会丢失类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29633146/
我是一名优秀的程序员,十分优秀!