gpt4 book ai didi

java - 为什么我会丢失类型信息?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:51 24 4
gpt4 key购买 nike

我发现 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
}

我收到有关类型不兼容的编译错误,即:“对象无法转换为条目”。

Ideone for convenience

如果没有变量再次存储它,为什么 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com