Map.Entry m =(Map.Entry)i.next();

时间:2011-05-19 20:24:04

标签: java

为什么我需要在(Map.Entry)前面i.next();?为什么我不能只有Map.Entry m = i.next();

对不起。这是一个HashMap。

4 个答案:

答案 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,但我猜测:

  • 您已习惯使用泛型的Java(≥1.5)代码,例如: HashMap<K, V>
  • 您现在正在维护为Java 1.4或更早版本编写的不使用泛型的代码库。

e.g。您可能知道HashMapString个密钥和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()在您不使用泛型时返回对象,并且您必须将其强制转换为能够分配它。