将map.values()返回的Collection转换为List

时间:2017-04-14 18:17:10

标签: java arraylist collections hashmap

我已经尝试了我所知道的一切以及我在网上找到的任何东西,但它只是不起作用。我一直在说:

java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.mycompany.myproject.dto.MyDto

如果有人能在下面的代码中告诉我我做错了什么,我将不胜感激:

List<Map<Long, MyDto>> dtoList = restTemplate.getForObject(myRestUrl + "/some-path/dtoInfo/" + ids, List.class);
Map<Long, MyDto> myMap = dtoList.get(0);
System.out.println("myMap SIZE is: " + myMap.size());
System.out.println("myMap is: " + myMap);

List<MyDto> dtos = new ArrayList<MyDto>(myMap.values());
StringJoiner sj = new StringJoiner(",");
for(MyDto obj : dtos) {
    sjStoreIds.add(obj.getId());
}

REST调用带有列表,其中包含 HashMap 对象,其中包含&#34; Key&#34;类型和&#34;值&#34;类型 MyDto 。 然后我正在打印&#34;尺寸&#34;地图和地图本身。两者都打印正确和预期的信息。

然后我从地图中提取值列表,如下所示:

List<MyDto> dtos = new ArrayList<MyDto>(myMap.values());

那里没有问题。

但是,当我试图通过转换列表中的对象(dtos)时,如下所示:

for(MyDto obj : dtos) {
    sjStoreIds.add(obj.getId());
}

我得到 java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.mycompany.myproject.dto.MyDto for for(MyDto obj:dtos){部分。

现在旋转我的大脑超过2个小时。 :(

我确信它会发生一些非常基本的事情,一旦我知道它就会生气和尴尬,但有人可以告诉我我做错了吗?

修改

以下是我在服务器端的REST实现:

    @Override
    public List<Map<Long, MyDto>> getInfo(String idValues) {
        List<Map<Long, MyDto>> returnList = new ArrayList<>();
        Map<Long, MyDto> result = new HashMap<>();

        String[] ids = idValues.split(",");
        for(String id : ids) {
            result.put(Long.parseLong(id), testInfo.get(Long.parseLong(id)));
        }

        returnList.add(result);

        return returnList;
    }

&#34; testInfo &#34;上面是一个由SQL查询构建的映射。

1 个答案:

答案 0 :(得分:5)

restTemplate.getForObject会向您返回一些 List<Map<Long, MyDto>>的内容。您显示的所有代码都是类型安全且正确的,但getForObject会默默地跳过其签名中的类型检查,并且会咬你。找出真正的类型。 (根据您向我们展示的内容,它可能是List<Map<Long, Map<Something, Something>>>。)