2011-12-31 49 views
1
class ZiggyTest{ 

    public static void main(String[] args){ 

     List<Integer> list = new LinkedList<Integer>(); 
     list.add(4); 
     list.add(5); 
     list.add(-5); 

     for(Iterator i = list.iterator(); i.hasNext();){ 
      Integer in = i.next(); 
      System.out.println(in); 
     } 
    } 

} 

上面的代碼的例子的結果以下編譯器錯誤:爲什麼一個迭代需要一般定義的列表的鑄造

ZiggyTest.java:17: incompatible types 
found : java.lang.Object 
required: java.lang.Integer 
      Integer in = i.next(); 
          ^
1 error 

爲什麼Iterator.next()方法需要鑄造時與Iterator關聯的列表是一般聲明的?

回答

16

Iterator.next()結果需要轉換,因爲Iterator被錯誤地聲明爲而沒有通用模板類型。

如果你有一個List<Integer>那麼正確類型的迭代器是Iterator<Integer>

for (Iterator<Integer> i = list.iterator(); i.hasNext();) { 
    Integer in = i.next(); 
    System.out.println(in); 
} 

或者,寫:

for (Integer in: list) { 
    System.out.println(in); 
} 

,避免使用明確的迭代器。

3

如果你想避免演員陣容,你需要Iterator的基因型版本,在你的情況下是Iterator<Integer>。如果你看看List#iterator方法的javadoc,你會發現它返回一個基因化版本。

因此,只要改變你的for循環到

for(Iterator<Integer> i = list.iterator(); i.hasNext();) 

和所有將編譯就好了。

Oracle example說明了與剛剛遇到的相同的問題。在ex1中,編譯錯誤是由缺失的cast造成的,在ex2中,這是通過使用迭代器的基因化版本來解決的

相關問題