为什么我需要在(Map.Entry)
前面i.next();
?为什么我不能只有Map.Entry m = i.next();
?
对不起。这是一个HashMap。
答案 0 :(得分:5)
因为它显然不是Iterator<Map.Entry>
。也许它是Iterator<Object>
,或Iterator<Map.Entry<String, String>>
或其他不同的东西。
例如,以下Map
Map<String, Object> map = new HashMap<String, Object>();
返回以下Iterator
Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
反过来又在Map.Entry
next()
Map.Entry<String, Object> entry = iterator.next();
答案 1 :(得分:1)
因为你没有正确使用泛型(这是一个麻烦,我知道一遍又一遍地输入所有东西,但它是值得的)当它们汇集在一起时,它们会为你做这个(转换为Map.Entry)
HashMap<String, YourClass> map;
Iterator<Map.entry<String, YourClass>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.entry<String, YourClass> entry = it.next();//see no explicit cast
//use entry
}
作为最终的提示复制粘贴(和一个体面的IDE)是你最好的泛型的朋友
答案 2 :(得分:1)
这是一个疯狂的猜测,因为你没有发布任何代码或说明你正在使用哪个版本的Java,但我猜测:
HashMap<K, V>
e.g。您可能知道HashMap
有String
个密钥和Integer
值,但这不能反映在HashMap
的类型中,因此您必须投放单个值。
使用泛型:
HashMap<String, Integer> map;
// ...
int sum = 0;
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
it.hasNext;
) {
Map.Entry<String, Integer> e = it.next();
Integer value = e.getValue();
sum += value.intValue();
}
没有泛型:
HashMap map;
// ...
int sum = 0;
for (Iterator it = map.entrySet().iterator();
it.hasNext;
) {
Map.Entry e = (Map.Entry) it.next();
Integer value = (Integer) e.getValue();
sum += value.intValue();
}
如果泛型不可用(或者您正在使用为您提供非泛型集合的旧库),则别无选择,只能应用这些强制转换。
顺便说一句:即使你做有泛型,这些强制转换仍然由编译器在幕后应用。
注意:省略foreach循环和自动取消装箱,因为它们在Java 1.4及更早版本中也不可用。
答案 3 :(得分:0)
因为i.next()
在您不使用泛型时返回对象,并且您必须将其强制转换为能够分配它。