簡體   English   中英

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

[英]Map.Entry m = (Map.Entry)i.next();

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

抱歉。 這是一個HashMap。

因為它顯然不是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();

因為您沒有正確使用泛型(我知道一遍又一遍地鍵入所有內容很麻煩,但這是值得的),當它們放在一起時,他們會為您做(將其轉換為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)是使用泛型的最大朋友

這有點大膽的猜測,因為您尚未發布任何代碼或未聲明要使用的Java版本,但是我猜測:

  • 您習慣使用泛型的Java(≥1.5)代碼,例如HashMap<K, V>
  • 現在,您正在維護一個不使用泛型的,為Java 1.4或更早版本編寫的代碼庫。

例如,您可能知道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();
}

如果無法使用泛型(或者您正在使用提供非泛型集合的舊式庫),則只能選擇使用這些強制類型轉換。
BTW:即使有仿制葯,這些強制類型轉換仍在引擎罩由編譯器應用。

注意:省略了foreach循環和自動拆箱,因為這些在Java 1.4和更早版本中也不可用。

因為當您不使用泛型時, i.next()返回對象,因此必須對其進行i.next()轉換才能進行分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM