Java Iterator 原始类型 Iterator 有什么风险
使用原始类型 iterator 会丢失泛型信息,导致编译器无法在编译期检查元素类型,从而引发 classcastexception。具体做法是避免声明为无参数的 iterator,而是指定具体的泛型参数,例如 iterator。这样做可以让编译器拦截不匹配类型的操作,确保代码的类型安全。

原始类型 Iterator 如何导致 ClassCastException
当集合中混入不同类型元素且使用原始类型 Iterator 遍历时,取出元素会被强制转换为错误的类型。例如将 Integer 放入 List 后,用原始 Iterator 遍历并尝试转为 String,就会抛出异常。解决方法是使用泛型化的 Iterator 或在增强 for 循环中指定类型。

import java.util.*;
public class Main {
public static void main(String[] args) {
List<string> list = new ArrayList();
list.add("hello");
// 通过反射或原始类型插入错误类型
((List) list).add(123);
// 使用原始类型 Iterator
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next(); // 这里会抛出 ClassCastException
System.out.println(s.length());
}
}
}</string>
泛型化 Iterator 如何避免类型转换错误
使用泛型化的 Iterator 可以在编译期捕获类型不匹配。例如声明 Iterator 后,next() 直接返回 String,无需手动强转。如果集合中包含非 String 类型,编译器会报错,从而避免运行时异常。

import java.util.*;
public class Main {
public static void main(String[] args) {
List<string> list = new ArrayList();
list.add("hello");
((List) list).add(123); // 依然可以插入错误类型
// 使用泛型化 Iterator
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next(); // 编译期不会报错,但运行时会抛异常
System.out.println(s.length());
}
}
}</string></string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











