泛型Iterator的核心是保障迭代过程类型安全、免强转、编译期检错;其声明与获取需与集合元素类型一致,通过iterator()或GetEnumerator()获得,典型三步流程(获取、hasNext、next)全程依赖泛型推导类型。

Iterator 泛型支持的核心是让迭代过程类型安全、无需手动强转、编译期就能检查错误。它不是额外功能,而是集合与迭代器配合使用的标准方式。
泛型 Iterator 的声明和获取
泛型 Iterator 必须与集合的元素类型一致。获取方式很简单:调用集合对象的 iterator() 方法,返回值直接就是带泛型的 Iterator<T>。
- Java 中:
Iterator<String> it = list.iterator();(list 是ArrayList<String>) - C# 中对应的是
IEnumerator<T>,通常通过IEnumerable<T>.GetEnumerator()获取,或更常用foreach隐式使用 - 泛型参数必须是引用类型(Java 中不能是基本类型,要用包装类如
Integer;C# 中泛型支持值类型,如int)
泛型 Iterator 的典型使用流程
以 Java 为例,三步固定写法,每一步都依赖泛型保障类型正确:
-
获取迭代器:
Iterator<Person> it = peopleList.iterator(); -
判断是否存在下一项:
while (it.hasNext())—— 返回boolean,不涉及类型 -
安全取出元素:
Person p = it.next();—— 直接得到Person类型,不用(Person) it.next()
为什么必须用泛型版本?
对比非泛型 Iterator 就清楚了:
- 非泛型:
Iterator it = list.iterator(); String s = (String) it.next();—— 强转可能失败,运行时报ClassCastException - 泛型:
Iterator<String> it = list.iterator(); String s = it.next();—— 编译器确保next()返回的就是String,错在写代码时就被拦住 - C# 同理:
IEnumerator<int>的Current属性直接返回int,避免装箱拆箱和运行时类型错误
泛型与增强 for 循环/foreach 的关系
增强 for(Java)和 foreach(C#)本质就是泛型 Iterator 的语法糖:
- Java:
for (String s : stringList)等价于用Iterator<String>遍历 - C#:
foreach (var item in collection)要求collection实现IEnumerable<T>,自动获取泛型枚举器 - 二者都继承泛型安全性:循环变量类型由集合泛型决定,编译器推导或强制指定


















