如何将子类对象集合批量向上转型为父类对象集合?
解决方法
Java中泛型是不变的,List<ComponentInfo>并非List<BaseInfo>的子类(尽管ComponentInfo继承自BaseInfo),所以直接向上转型集合类型会失效。以下是几种可行的实现方式:
1. 逐个条目转换(安全直观)
遍历两个Map的每个条目,将子类List转换为父类List后存入新Map:
Map<String, List<BaseInfo>> combinedMap = new HashMap<>(); // 处理ComponentInfo集合 allCompInfo.forEach((key, compList) -> { // 利用ArrayList构造方法自动完成元素向上转型 List<BaseInfo> baseList = new ArrayList<>(compList); combinedMap.put(key, baseList); }); // 处理FunctionInfo集合 allFunctionInfo.forEach((key, funcList) -> { List<BaseInfo> baseList = new ArrayList<>(funcList); combinedMap.put(key, baseList); });
这种方式完全符合类型安全要求,不会产生编译警告。
2. Stream流式合并(简洁高效)
如果需要合并两个Map的内容,可通过Stream API一次性完成转换与合并:
Map<String, List<BaseInfo>> combinedMap = Stream.concat( allCompInfo.entrySet().stream(), allFunctionInfo.entrySet().stream() ) .collect(Collectors.toMap( Map.Entry::getKey, entry -> new ArrayList<>(entry.getValue()), // 若存在重复key,合并两个列表(根据业务需求可调整) (existing, newList) -> { existing.addAll(newList); return existing; } ));
3. 强制转型(不推荐,仅特殊场景)
若能保证后续不会向转换后的List中添加非BaseInfo子类元素,可通过通配符配合强制转型跳过编译检查:
@SuppressWarnings("unchecked") Map<String, List<BaseInfo>> compMap = (Map<String, List<BaseInfo>>) (Map<?, ?>) allCompInfo; @SuppressWarnings("unchecked") Map<String, List<BaseInfo>> funcMap = (Map<String, List<BaseInfo>>) (Map<?, ?>) allFunctionInfo; // 合并两个Map Map<String, List<BaseInfo>> combinedMap = new HashMap<>(compMap); combinedMap.putAll(funcMap);
注意:此方式会产生unchecked警告,若后续操作违反类型约定,可能抛出ClassCastException。
内容的提问来源于stack exchange,提问作者RCode
相关产品推荐
相关产品推荐

