Java泛型场景下,如何用迭代器向Set添加对象?问题代码求解
问题分析与解决方案
你的代码存在两个核心问题:
- 迭代器未使用泛型:声明的
Iterator it是原始类型,导致it.next()返回Object,需要强制转换;正确做法是使用泛型迭代器Iterator<E>,直接获取E类型元素。 - 重复调用
it.next():在if条件和try块中各调用一次it.next(),会导致迭代器指针两次移动,跳过大量元素,逻辑完全错误。
修正方案1:使用泛型迭代器
Set<E> selectUniques() { Set<E> set = new HashSet<>(); // 使用泛型迭代器,直接返回E类型元素 Iterator<E> it = list.iterator(); while (it.hasNext()) { E element = it.next(); // 仅调用一次next(),保存当前元素 if (frequency(element) == 1) { set.add(element); } } return set; }
修正方案2:使用增强for循环(无需迭代器)
增强for循环会自动处理泛型类型,代码更简洁:
Set<E> selectUniques() { Set<E> set = new HashSet<>(); for (E element : list) { if (frequency(element) == 1) { set.add(element); } } return set; }
修正方案3:Java 8+ Stream API(更简洁)
如果项目使用Java 8及以上版本,流式处理可以大幅简化代码:
import java.util.stream.Collectors; Set<E> selectUniques() { return list.stream() .filter(element -> frequency(element) == 1) .collect(Collectors.toSet()); }
补充说明
由于你的list是泛型LinkedList<E>,只要泛型使用规范,列表中的元素必然是E类型,完全不需要ClassCastException的捕获逻辑,上述方案都可以安全移除异常处理代码。
内容的提问来源于stack exchange,提问作者10969_ shirazu_
相关产品推荐
相关产品推荐

