2011-12-31 7 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()メソッドは、キャストが必要ありませんイテレータに関連付けられたリストは総称的に宣言されていますか?

答えて

16

結果は、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(Iterator<Integer> i = list.iterator(); i.hasNext();) 

を変更し、すべてがうまくコンパイルされます。

Oracle exampleには、直前に発生したのと同じ問題があります。 ex1では、欠落したキャストによってコンパイルエラーが発生し、ex2では、これは、生成されたイテレータのバージョンを使用して解決されます。

関連する問題