Java增强for循环报错:仅可遍历数组或java.lang.Iterable实例的解决方法
搞定这个Java增强for循环错误!
先搞懂错误到底说啥
这个报错Can only iterate over an array or an instance of java.lang.Iterable翻译过来就是:你想用foreach循环遍历的东西,既不是数组,也没实现Iterable接口。说白了,增强for循环只认这两种“可遍历”的对象——要么是数组,要么是提供了迭代器(Iterator)的集合类(比如List、Set这些,它们都继承了Iterable)。
看你的代码,an.getSortedByAnQty()返回的对象肯定不符合这俩条件,所以编译器直接给你亮红牌了。
怎么修复?分两种情况来
情况1:你能修改Anagrams类的getSortedByAnQty()方法
既然你要遍历的是一个个List<String>,那这个方法最合理的返回类型应该是**List<List<String>>**(或者其他实现Iterable的集合,比如Set<List<String>>)。因为你要的是一组List,而不是单个List或者别的东西。
比如把Anagrams里的方法改成这样:
public class Anagrams { // 构造方法和其他逻辑... public List<List<String>> getSortedByAnQty() { // 这里写你的业务逻辑,返回按字谜数量排序后的分组列表 List<List<String>> groupedAnagrams = new ArrayList<>(); // 填充数据的代码... return groupedAnagrams; } }
这样你的主函数里的增强for循环就能正常跑了,因为List本身就实现了Iterable接口,完全符合要求。
情况2:没法修改Anagrams类的方法
如果因为某些限制不能改这个方法,那你得把它的返回值转换成可遍历的对象:
- 如果方法返回的是单个
List<String>:那你根本不需要外层循环,直接遍历这个List就行;或者把它塞进一个集合里再遍历,比如:// 把单个List包装成可遍历的集合 List<List<String>> wrapperList = new ArrayList<>(); wrapperList.add(an.getSortedByAnQty()); for(List<String> wlist : wrapperList) { // 你的业务代码 } - 如果方法返回的是数组:那增强for循环本来就支持数组,可能是你之前的方法返回类型声明错了?检查一下方法的返回值是不是
List<String>[]这种数组类型。
再核对你的代码片段
看你主函数里的循环for(List<String> wlist : an.getSortedByAnQty()),明显是期望每次循环拿到一个List<String>,所以getSortedByAnQty()必须返回一个包含这些List的可迭代集合。第一种修复方式是最直接也最合理的。
内容的提问来源于stack exchange,提问作者Lukasz
相关产品推荐
相关产品推荐

