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一般被声明时需要强制转换?
答案 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中,这是通过使用迭代器的泛化版本来解决的。