一个Map泛型的问题

今天遇到一个神奇的问题. 直接上代码.

1
2
3
4
5
6
7
//首先有一个泛型比较复杂的Map, 里面套了一个Key泛型为Integer的Map
Map<String, Map<Integer, CategoriesContainer>> fieldCategoriesMap;

//初始化 复制等操作.

//第一个get获取到Key泛型为Integer的Map, 然后在get, 这里为了讲述方便直接传入一个常量3,
fieldCategoriesMap.get("xxxxx").get(3).getName())

执行上述代码后, 居然空指针了!! 确认都有值, 绝对不可能, debug一看, 居然.get(3)返回的是null在.getName()肯定空指针了…

可是为什么呢?

继续debug检查, 看到如下情况

图片
图片

卧槽, 牛逼了, 嵌套在里面的Map的泛型明明是Integer, 但是debug里看到key的值居然是char[1] ???

这尼玛是什么鬼?!?!?!?!?!

然后第二张图里用get("3"), 居然拿出东西来了, 偶滴个神啊, 这是在毁三观吗??????

再如此毁三观的情况下, 利马psvm写了个Main方法出来, 重新测试一下, 居然发现一切又正常了? debug看key的值也确实Integer了, 也必须用整形才能get出东西了.

这尼玛, 更毁三观了好吗? 为嘛我之前代码里面就不对了.

后来反应过来了, 我自己写了一个List转Map的方法, 自动将传入的List转换为Map, 并用List里的Bean的Id作为Key, 这里使用这个方法.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static Map parse(Collection c, String s) {
Map map = new LinkedHashMap();
try {
for (Object v : c) {
map.put(v
.getClass()
.getMethod(
"get" + s.substring(0, 1).toUpperCase()
+ s.substring(1)).invoke(v, o).toString(), v);
}
return map;
} catch (Exception e) {
System.out.println("data format error!");
return null;
}
}

这个方法的返回值是一个没有泛型Map, 然后返回的map被我put到了fieldCategoriesMap里.

fieldCategoriesMap就是这个Map<String, Map<Integer, CategoriesContainer>>

尼玛, 原来没有泛型了Map是可以被put到有泛型限制的map里去的. 这绝逼是超级大坑啊. 太危险了.

这样做最外层的Map明明有泛型限制, 那么在多人协同开发的时候, 最外层map的使用者看到有泛型必然不会怀疑有问题, 结果…

即使是独立开发中, 自己遇到类型错误的问题, 找到死也很难怀疑到Map的泛型有问题上去… 细思极恐…

接着在继续测试

1
2
3
4
Map<String, Map<Integer, String>> test = new HashMap<>();
Map c = new HashMap<>();
c.put("123123", new Date()); //test里嵌套的Map要求泛型为Integer, String. 这里放的String和Date
test.put("321", c); //然后put到test中

卧槽卧槽, 居然也执行成功了. 说明不光是Key的泛型有这个问题, Value的泛型也有这个问题. 细思恐极!!

切记切记这个问题.

文章目录
,