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

时间:2011-12-31 15:04:16

标签: 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);
        }
    }

}

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

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

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

2 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:3)

如果你想避免演员表,你需要Iterator的通用版本,在你的情况下是Iterator<Integer>。如果您查看List#iterator方法的javadoc,您会看到它返回一个通用版本。

所以只需将你的for循环更改为

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

所有人都会编译得很好。

Oracle example说明了您刚刚遇到的问题。在ex1中,编译错误是由丢失的强制转换引起的,在ex2中,这是通过使用迭代器的泛化版本来解决的。