0

我有以下代码:

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

4

2 回答 2

0

somethingsByString.getValue()在这两种情况下都返回 a List<Something>

但是,在第二种情况下,您正在迭代其中的元素List<Something>(使用增强的 for 循环)并尝试将单个Something实例传递给methodThatTakesAListOfSomething. 这不起作用,因为该方法需要一个List<Something>.

如果要Something在单独的方法调用中处理每个实例,则应更改methodThatTakesAListOfSomething为采用单个Something实例,或创建一个采用单个 的新方法Something

for (Map.Entry<String, List<Something>> somethingByString : somethingsByString.entrySet()) {
    for(Something something : somethingsByString.getValue()) {
        methodThatTakesSomething(something);
}
于 2017-12-26T12:51:07.233 回答
0

这种行为仅仅是因为在第二种情况下,您使用的是嵌套foreach循环,这意味着您使用第一个循环遍历条目,foreach然后第二个循环遍历列表的元素。

因此,将编译错误作为声明为 like 的方法 methodThatTakesAListOfSomething(List<Something> input) 不能接受 type 的输入Something

这是两种完全不同的类型

Something相反,如果您的方法需要一个类型而不是 a List<Something>then 声明该方法具有methodThatTakesAListOfSomething(Something input)else 的参数,如果该方法应该采用List<Something>然后将方法声明为,则要克服该问题methodThatTakesAListOfSomething(List<Something> input)

最后,但并非最不重要的是,仅在需要访问时使用嵌套foreach循环,在要访问时Something使用单个foreach循环List<Something>

于 2017-12-26T12:51:28.550 回答