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

ModelMapper changes generic type on runtime - weird behavior

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

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

有如下代码:

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 但它仍然发生。

有什么想法吗?

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