bug探索之路:List<Map>get取出元素却是String?

1,315 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、bug初现峥嵘

image.png

有一说一我定义的List<Map>对吧,我get(0)取出的元素也应该是Map类型没问题吧。不行,编译器告诉我,java.lang.String cannot be cast to java.util.Map

这个意思就是说,你这个就是String类型,你别想骗我它是Map类型。

没办法嘛,你一个卑微程序猿罢了。你能干得过编译器?人家说啥就是啥吧。

二、用String声明接一下get(0)的元素

image.png

离谱的一幕出现了,IDEA源码检查机制告诉你这个就是Map,你别想虚晃一枪把他私自变成String

我现在有理由怀疑,你这个源码检查检查机制和编译器不是一家公司产的,你俩要不要对峙一下看看自己在说什么可以嘛?

要不你俩打一架?,反正我是受不了了。

三、解决方案:先强制转换成String再用json解析成Map

我的诉求是取出data_list这个List<Map>里面的第一个Map,然后找到这个Map里面key为insind对应的value.

        String response=http_sevice.doPost(url,paramMap);
        Gson gson = new Gson();
        Map<String, Object> map = new HashMap<String, Object>();
        map = gson.fromJson(response, map.getClass());//关键
        System.out.println(map);
        List<Map<String, Object>> data_list = (List<Map<String, Object>>) map.get("data");
        try {// 当产生异常时,必须有处理方式。要么捕获,要么声明。

            Map<String, Object> data = new HashMap<String, Object>();
            data = gson.fromJson(String.valueOf(data_list.get(0)), data.getClass());//关键
            String insind = String.valueOf(data.get("insind"));
            return insind;
        } catch (IndexOutOfBoundsException e) {
            return "-1";
        }

总结

说实话,这个我真的不知道该说什么了。我的脑子告诉我这是编译器和源码检查机制的问题,但是,理智想想这个java8编译器正常了多少年了,不可能有这么明显的bug。

所以这个问题可能是我触碰到了什么不为人知的小bug吧, 也希望各位如果如果看出有什么问题的可以评论指教。

我也是赶鸭子上架用的java做个后台,这个语言很多东西也不熟练。