ModelMapper在运行时更改泛型类型 - 奇怪的行为

时间:2015-03-17 12:17:17

标签: java maven modelmapper generics

我在Java中遇到了一种非常奇怪的行为。 我有两个没有分层连接的不同类: 类模板(类型层次结构是对象 - > A - > B - >模板)和类TemplateDto(对象 - > TemplateDto)。

我使用ModelMapper(org.modelmapper.ModelMapper)在两个类之间进行映射(由于字段名称相同,因此使用默认映射。)

有以下代码:

List<Template> templates = cvService.getTemplates();
List<TemplateDto> resultDtos = new ArrayList<TemplateDto>();
modelMapper.map(templates,resultDtos);
TemplateDto example = resultDtos.get(0);

最后一行抛出:

java.lang.ClassCastException: com.vs.framework.domain.cv.Template cannot be cast to com.vs.framework.dto.cv.TemplateDto

这很奇怪。当我调试这个部分时,我看到在映射之后,resultDtos是List类型而不是List类型的列表,这让我大吃一惊。

我已经尝试清理我的tomcat,maven clean install但它仍然会发生。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

Java使用 type erasure 实现泛型,这意味着运行时代码无法知道您的ArrayList应该是ArrayList<TemplateDto>

http://modelmapper.org/user-manual/generics/介绍如何使用TypeToken来解决列表中的此问题。看起来应该是这样的:

List<Template> templates = cvService.getTemplates();
Type listType = new TypeToken<List<TemplateDto>>() {}.getType();

List<TemplateDto> resultDtos = modelMapper.map(templates, listType);
TemplateDto example = resultDtos.get(0);