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

3
我在Java中遇到了一个非常奇怪的行为。 我有两个不具有层次关系的不同类: Class Template (类型层次结构为Object -> A -> B -> Template),和class TemplateDto (Object -> 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,但问题仍然存在。

有任何想法吗?


根据他们的教程,您似乎完全没有正确使用该函数。http://modelmapper.org/getting-started/ - Evan Knowles
我已经使用模型映射器一段时间了,从来没有遇到过这种类型的映射问题(有许多映射方式)。无论如何,我的问题不是关于使用模型映射器,而是关于泛型类型在运行时被更改的奇怪行为。 - Eyal
1个回答

6
Java使用类型擦除实现泛型,这意味着运行时代码无法知道您的ArrayList应该是一个ArrayList。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);

2
谢谢,对我来说,在调试模式下看到一个包含其他类型对象的特定泛型类型数组似乎很奇怪,但当我了解到类型擦除时,一切都变得清晰明了——这些数组在运行时实际上是无类型的。 - Eyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接