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

Eya*_*yal 1 java generics maven modelmapper

我在 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);
Run Code Online (Sandbox Code Playgroud)

最后一行抛出:

java.lang.ClassCastException: com.vs.framework.domain.cv.Template cannot be cast to com.vs.framework.dto.cv.TemplateDto
Run Code Online (Sandbox Code Playgroud)

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

我试图清理我的 tomcat,maven 清理安装,但它仍然发生。

有任何想法吗?

Str*_*ior 5

Java 使用类型擦除实现泛型,这意味着运行时代码无法知道您ArrayListArrayList<TemplateDto>.

http://modelmapper.org/user-manual/generics/描述了如何使用 aTypeToken来解决列表的这个问题。它应该是这样的:

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

List<TemplateDto> resultDtos = modelMapper.map(templates, listType);
TemplateDto example = resultDtos.get(0);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,在调试模式下,我看到一个包含某种泛型类型的数组,其中包含其他类型的对象,这让我看起来很尴尬,但是当我读到类型擦除时,这一切都是有道理的 - 数组在运行时实际上是无类型的。 (2认同)