You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ModelMapper列表映射后遍历抛出ClassCastException问题求助

解决ModelMapper列表映射后的ClassCastException问题

嘿,我一眼就揪出问题所在了,咱们一步步来搞定它:

1. 核心错误:TypeToken的目标类型写错了

你的代码里定义的listType指向的是List<ObjectiveDto>的类型,但你明明是要把objectiveDtos(List<ObjectiveDto>)转换成List<ObjectiveModel>啊!TypeToken必须指向目标类型的列表,而不是原类型的!

错误代码:

Type listType = new TypeToken<List<ObjectiveDto>>() {}.getType(); // 这里写错成原类型Dto了
List<ObjectiveModel> objectiveModels = modelMapper.map(objectiveDtos, listType);

修正后的正确写法:

Type listType = new TypeToken<List<ObjectiveModel>>() {}.getType(); // 改成目标类型Model
List<ObjectiveModel> objectiveModels = modelMapper.map(objectiveDtos, listType);

2. 更稳妥的替代方案:手动逐个转换元素

有时候ModelMapper的列表映射会返回代理对象(延迟转换),后续遍历强转时仍可能踩坑,所以更可靠的方式是逐个转换元素:

List<ObjectiveModel> objectiveModels = objectiveDtos.stream()
    .map(objectiveDto -> modelMapper.map(objectiveDto, ObjectiveModel.class))
    .collect(Collectors.toList());

这种方式下每个ObjectiveDto都会被明确转换成ObjectiveModel实例,列表里的元素都是真实的Model对象,遍历修改时绝对不会再出现类型转换异常。

为啥原来的代码会报错?

当你用错误的TypeToken(List<ObjectiveDto>)调用map方法时,ModelMapper相当于做了个“无效映射”——把List<ObjectiveDto>原样返回,里面的元素还是ObjectiveDto对象。当你用for (ObjectiveModel objectiveModel: objectiveModels)遍历的时候,JVM尝试把Dto强制转换成Model,自然就抛出ClassCastException了。

内容的提问来源于stack exchange,提问作者davidvera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:07:57