Java父子类场景下HashMap泛型类型不兼容错误求助
解决HashMap一键多值存储的类型不兼容问题
这个问题我之前在项目里也踩过坑,核心原因是Java泛型的协变限制——虽然SeaPort是Thing的子类,但ArrayList<SeaPort>并不被视为ArrayList<Thing>的子类,所以直接调用put方法会触发类型不匹配的错误。下面给你几个实用的解决思路,你可以根据自己的业务场景选择:
方案1:给HashMap的泛型加上通配符
把HashMap的定义改成允许存放任何Thing子类的ArrayList:
HashMap<String, ArrayList<? extends Thing>> hashmap = new HashMap<>();
这样ArrayList<SeaPort>就能正常put进去了。不过要注意:从这个HashMap里取出的集合,你不能直接往里面添加元素(除了null),因为编译器无法确定集合实际接受的是哪个具体的Thing子类。如果只是读取集合里的元素、调用Thing的方法,这个方案完全没问题。
方案2:把ArrayList<SeaPort>转换成ArrayList<Thing>
如果你需要后续能往集合里添加任意Thing子类的元素,可以用ArrayList的构造方法直接转换:
hashmap.put(b, new ArrayList<>(world.ports));
因为SeaPort是Thing的子类,所以集合里的每个元素都能安全向上转型为Thing,构造出来的就是标准的ArrayList<Thing>,完美匹配HashMap的泛型要求。
方案3:直接限定HashMap的泛型为ArrayList<SeaPort>
如果你的这个HashMap从始至终只需要存放SeaPort的集合,那干脆直接修改HashMap的定义:
HashMap<String, ArrayList<SeaPort>> hashmap = new HashMap<>();
这个方案最直接,没有任何额外限制,但灵活性最低——之后没法往里面放其他Thing子类的集合了。
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

