当我在Java中迭代非泛型映射时,编译器会抱怨
我在Java中迭代非泛型映射时遇到了weired问题当我在Java中迭代非泛型映射时,编译器会抱怨,java,generics,Java,Generics,我在Java中迭代非泛型映射时遇到了weired问题 Map map=new HashMap(); for (Map.Entry entry:map.entrySet()){ } 但编译器抱怨说“类型不匹配:无法从元素类型对象转换为Map.Entry” 当我将映射类型更改为泛型时,它可以工作 Map<Object,Object> map=new HashMap<Object,Object>(); for (Map.Entry entry:map.entrySet())
Map map=new HashMap();
for (Map.Entry entry:map.entrySet()){
}
但编译器抱怨说“类型不匹配:无法从元素类型对象转换为Map.Entry”
当我将映射类型更改为泛型时,它可以工作
Map<Object,Object> map=new HashMap<Object,Object>();
for (Map.Entry entry:map.entrySet()){
}
Map Map=newhashmap();
对于(Map.Entry:Map.entrySet()){
}
这让我很困惑,有人知道原因吗?提前谢谢。为什么这个不行? 这取决于你的编译器 使用Mac上的JavaC1.6.020,我没有任何问题 也许正如@newacct所建议的,泛型被用于扩展for语句。但是,由于这取决于编译器(而不是JLS),因此要确切地知道原因并不容易 如何将其更改为工作模式? Entry是一个泛型类,所以如果您选择在应用程序中使用泛型,那么您应该在任何地方都使用它们
Map<Object,Object> map=new HashMap<Object,Object>();
for (Map.Entry<Object, Object> entry:map.entrySet()){
}
Map Map=newhashmap();
对于(Map.Entry:Map.entrySet()){
}
当您使用原始类型时,就像您在这里使用Map
一样,所有泛型都被关闭,因此entrySet()
只返回一个裸露的Set
类型(而不是Set
),如果您对它进行迭代,您只能从中获取对象。在JDK1.5Map.entrySet()之前
返回了一个集合
(属于Map.Entry的
,但您无法直接判断)。
Set entries=map.entrySet();
Map.Entry=(Map.Entry)entries.iterator().next();//@事实上,它在一些编译器(这里是javac)上编译,甚至没有警告。
Set entries = map.entrySet();
Map.Entry entry = (Map.Entry) entries.iterator().next(); // <-- notice the cast!