我在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但它仍然会发生。
有什么想法吗?
答案 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);