Map.getValue()在特定时间返回List,另一次返回Object

时间:2017-12-26 12:48:35

标签: java list dictionary getvalue

我有以下代码:

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

2 个答案:

答案 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>