为什么使用List Iterator的next方法报类型不兼容错误,而List的get方法不会?
报错根本原因
该错误和Iterator的next()方法本身逻辑无关,核心问题是你使用了无泛型参数的原始类型(Raw Type)Iterator,触发了Java泛型的类型擦除规则:
- 你初始代码中迭代器声明为
Iterator list2Iterator = list2.listIterator();,未给Iterator指定泛型参数,属于原始类型。原始类型的所有方法返回值都会被擦除为上界父类Object,因此list2Iterator.next()返回值是Object类型,无法直接传入要求参数为泛型E的list1.add()方法,触发类型不兼容报错。 - 改用
list2.get(i)的写法可以正常运行,是因为list2本身声明为List<E>带泛型参数,它的get()方法返回值就是E类型,和list1.add()的入参要求匹配,因此不会报错。
迭代器版本的正确写法
只需要给Iterator指定对应泛型参数即可正常运行:
public static <E> void append(List<E> list1, List<E> list2) { // 给Iterator指定泛型<E>,next()返回值就会是E类型 Iterator<E> list2Iterator = list2.listIterator(); while(list2Iterator.hasNext()) { list1.add(list2Iterator.next()); } }
额外优化建议
Java标准库已经提供了列表追加的原生实现,直接调用list1.addAll(list2)即可实现完全相同的功能,不需要手动写遍历逻辑。
内容的提问来源于stack exchange,提问作者gumbojoe
相关产品推荐
相关产品推荐

