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

原始类型 Iterator 如何导致 ClassCastException
当集合中混入不同类型元素且使用原始类型 Iterator 遍历时,取出元素会被强制转换为错误的类型。例如将 Integer 放入 List<string></string> 后,用原始 Iterator 遍历并尝试转为 String,就会抛出异常。解决方法是使用泛型化的 Iterator<e></e> 或在增强 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());
}
}
}泛型化 Iterator 如何避免类型转换错误
使用泛型化的 Iterator<t></t> 可以在编译期捕获类型不匹配。例如声明 Iterator<string> it = list.iterator()</string> 后,next() 直接返回 String,无需手动强转。如果集合中包含非 String 类型,编译器会报错,从而避免运行时异常。
立即学习“Java免费学习笔记(深入)”;

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


















