我有以下代码:
for (Map.Entry<String, List<Something>> somethingByString : somethingsByString.entrySet()) {
methodThatTakesAListOfSomething(somethingByString.getValue());
}
我尝试用这个改变代码:
for (Map.Entry<String, List<Something>> somethingByString : somethingsByString.entrySet()) {
for(Something something : somethingsByString.getValue()) {
methodThatTakesAListOfSomething(something);
}
编译器然后说我的方法不能将Something
作为参数,它需要List<Something>
。
为什么somethingsByString.getValue()
在第一种情况下会返回List<Something>
,而在第二种情况下却会Something
?
答案 0 :(得分:0)
somethingsByString.getValue()
都会返回List<Something>
。
但是,在第二种情况下,您正在迭代List<Something>
的元素(使用增强的for循环)并尝试将单个Something
实例传递给methodThatTakesAListOfSomething
。这不起作用,因为该方法需要List<Something>
。
如果要在单独的方法调用中处理每个Something
实例,则应更改methodThatTakesAListOfSomething
以获取单个Something
实例,或创建一个需要单个Something
的新方法{ {1}}:
for (Map.Entry<String, List<Something>> somethingByString : somethingsByString.entrySet()) {
for(Something something : somethingsByString.getValue()) {
methodThatTakesSomething(something);
}
答案 1 :(得分:0)
这种行为很简单,因为在第二种情况下,您使用嵌套的foreach
循环意味着您使用第一个foreach
循环迭代条目,然后第二个循环遍历元素列表。
因此,将编译错误作为声明为methodThatTakesAListOfSomething(List<Something> input)
的方法提供,不能接受Something
类型的输入。
这是两种完全不同的类型。
相反,要解决此问题,如果您的方法需要类型Something
而不是List<Something>
,则声明方法的参数为methodThatTakesAListOfSomething(Something input)
,如果该方法应采用List<Something>
{1}}然后将方法声明为methodThatTakesAListOfSomething(List<Something> input)
。
最后,但并非最不重要的是,当您需要访问foreach
时,只需使用嵌套的Something
循环,并在您想要访问foreach
时使用单个List<Something>
循环。< / p>