Java嵌套HashMap插入元素报类型不匹配错误如何修正
报错根因
你的代码报错来自两个核心问题,同时存在逻辑认知误区:
- 类型不匹配:
Map.put()方法的返回值是该键之前关联的旧值,不是Map实例本身。你代码里内层put("p1",object)返回的是Object类型,外层map1.put()需要接收HashMap类型的参数,直接触发你看到的类型不匹配报错。而且从逻辑上讲,外层Map存储的是内层Map的引用,你拿到内层Map引用后直接修改内容,不需要再把引用重新put回外层Map,这步操作本身就是多余的。 - 空指针风险:当某个
object.getId()第一次插入外层Map时,map1.get(object.getId())取到的是null,直接调用put方法会直接抛出空指针异常,哪怕类型修正了第一次插入也会运行失败。
另外你的代码还有两处编译级别的笔误:
- 泛型里的
Obzect是拼写错误,正确类名是Object object.getId是方法调用,需要补括号写成object.getId()
修正方案
Java 8及以上版本(推荐写法)
直接使用JDK提供的computeIfAbsent方法,不需要手动判断内层Map是否存在,也不需要提前单独声明内层Map实例,一行链式调用就能完成插入,完全符合你的需求:
map1.computeIfAbsent(object.getId(), k -> new HashMap<>()) .put("p1", object);
逻辑说明:computeIfAbsent会自动检查外层Map中是否存在当前id对应的键:
- 不存在:执行后面的lambda表达式创建新的内层HashMap,存入外层Map后返回这个新建的Map实例
- 已存在:直接返回已经存好的内层HashMap实例
拿到内层Map后直接调用put插入键值对即可,不会出现类型错误,也不会触发空指针。
Java 7及更早版本
老版本JDK没有computeIfAbsent接口,只需要先判断外层键是否存在,不存在时再新建内层Map即可,不会产生多余的实例化:
String outerKey = object.getId(); if (!map1.containsKey(outerKey)) { map1.put(outerKey, new HashMap<String, Object>()); } map1.get(outerKey).put("p1", object);
内容的提问来源于stack exchange,提问作者Ujjwal Kuikel
相关产品推荐
相关产品推荐

