Map.getValue() returns 某一次是List,另一次是Object

Map.getValue() returns a List a certain time, an Object another time

我有以下代码:

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() returns List<Something>,第二种情况是Something

somethingsByString.getValue() returns a List<Something> 在这两种情况下。

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

如果您想在单独的方法调用中处理每个 Something 实例,您应该将 methodThatTakesAListOfSomething 更改为采用单个 Something 实例,或者创建一个采用单个 Something 实例的新方法单身 Something:

for (Map.Entry<String, List<Something>> somethingByString : somethingsByString.entrySet()) {
    for(Something something : somethingsByString.getValue()) {
        methodThatTakesSomething(something);
}

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

因此给出编译错误,因为像 methodThatTakesAListOfSomething(List<Something> input) 这样声明的方法不能接受类型 Something 的输入。

这是两种完全不同的类型.

相反,如果您的方法需要类型 Something 而不是 List<Something> 来解决此问题,则声明该方法的参数为 methodThatTakesAListOfSomething(Something input) 否则,如果该方法应采用a List<Something> 然后将方法声明为 methodThatTakesAListOfSomething(List<Something> input)

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