使用ModelMapper转换List遇类型不匹配:无法将void转为List求解决
解决ModelMapper集合转换时的"无法将void转换为List"错误
问题原因分析
你遇到的错误核心是方法重载匹配错误。ModelMapper有两个核心map方法:
void map(Object source, Object destination):把源对象数据映射到已存在的目标对象中,无返回值<T> T map(Object source, Type destinationType):根据指定类型创建新对象并完成映射,返回目标类型实例
你的代码里虽然定义了集合的目标类型,但可能因为隐式类型转换或版本兼容问题,JVM误匹配到了无返回值的重载方法,才抛出"void无法转List"的类型错误。另外你的方法名convertBOTODOCreateRolebo和实际转换方向(DO→BO)不符,建议统一命名避免混淆。
正确解决方案
方案1:显式强制转换(兼容多数版本)
通过显式强制转换,确保调用带返回值的重载方法:
public static List<RoleBO> convertDOToBO(List<RoleDO> roleList) { java.lang.reflect.Type targetListType = new TypeToken<List<RoleBO>>() {}.getType(); // 显式强转,明确指定返回值类型 List<RoleBO> roleBOList = (List<RoleBO>) new ModelMapper().map(roleList, targetListType); return roleBOList; }
方案2:使用mapIterable方法(推荐的集合转换方式)
ModelMapper专门提供了集合转换的mapIterable方法,语义更清晰,能彻底避免重载匹配问题:
public static List<RoleBO> convertDOToBO(List<RoleDO> roleList) { ModelMapper modelMapper = new ModelMapper(); // 直接将Iterable转换为目标类型的List return modelMapper.mapIterable(roleList, RoleBO.class); }
额外优化建议
- 遵循Java驼峰命名规范:把
roleBO改为RoleBO、roleDO改为RoleDO,这是通用编码规范,能避免潜在的编译问题 - 复用ModelMapper实例:ModelMapper是线程安全的,不要每次转换都新建实例,全局复用能提升性能
- 统一方法命名:比如改成
convertDOToBO,明确标注转换方向,避免后续维护混淆
内容的提问来源于stack exchange,提问作者Sneha Raj
相关产品推荐
相关产品推荐

