有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

为什么迭代器。当泛型声明与迭代器关联的列表时,next()方法需要强制转换吗


共 (2) 个答案

  1. # 1 楼答案

    正是因为Iterator在没有泛型模板类型的情况下被错误地声明为,所以Iterator.next()结果需要强制转换

    如果您有一个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);
    }
    

    并完全避免显式迭代器

  2. # 2 楼答案

    如果想要避免强制转换,需要Iterator的泛化版本,在本例中是Iterator<Integer>。如果查看^{}方法的javadoc,就会发现它返回一个通用版本

    所以只需将for循环更改为

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

    一切都会很好

    {a2}说明了与您刚才遇到的相同问题。在ex1中,编译错误是由丢失的强制转换引起的,而在ex2中,这可以通过使用迭代器的通用版本来解决