为什么迭代器需要对一般定义的列表进行强制转换

zig*_*ggy 1 java oop generics collections

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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的代码示例导致以下编译器错误:

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

当与Iterator关联的List一般被声明时,为什么Iterator.next()方法需要强制转换?

Aln*_*tak 16

Iterator.next()结果需要正是因为铸Iterator被错误地宣称没有一个通用的模板类型.

如果你有一个List<Integer>正确的迭代器类型是Iterator<Integer>:

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

或者,写:

for (Integer in: list) {
    System.out.println(in);
}
Run Code Online (Sandbox Code Playgroud)

并完全避免使用显式迭代器.