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

标签 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 关联的列表被一般声明时?

最佳答案

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

并完全避免显式迭代器。

关于java - 为什么迭代器需要对一般定义的列表进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688812/

相关文章:

oop - 为什么我应该重载一个过程?为什么不添加过程名称?

c# - 如何保护仅访问器的 IEnumerable<string> 属性免于突变?

java - 如何重用与 JavaMail 的连接以避免 AuthenticationFailedException : Too many login attempts?

php - 如何在 WordPress 插件中使用命名空间和类

java - 尝试使用 Android "Parsing XML Data"代码不起作用 : "Error parsing XML"

python - 在不知道正确的派生类的情况下创建派生类的实例

c# - 泛型方法可以使用逆变/协变类型吗?

java - 使用 Guava 从列表中删除重复项

java - 从 bootstrap x-editable 发送数据

java - netty "Reflective setAccessible(true) disabled"的 spring-web-flux 错误