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);
我在 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);