2015-03-17 6 views
1

Я столкнулся с очень странным поведением в Java. У меня есть два разных класса, у которых нет иерархического соединения: Шаблон класса (иерархия типов - Object -> A -> B -> Template) и класс TemplateDto (Object -> TemplateDto).ModelMapper изменяет общий тип во время выполнения - странное поведение

Я использую 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, который ударяет меня по голове.

Я попытался очистить мой кота, maven clean install, но это все еще происходит.

Любые идеи?

+0

Основываясь на своем учебнике, вы, похоже, не используете эту функцию правильно. http://modelmapper.org/getting-started/ –

+0

Я некоторое время использую mapperper, у меня никогда не было проблем с этим типом сопоставления (есть много способов сопоставления). Во всяком случае, мой вопрос заключается не в использовании modelmapper, а о странном поведении типа Generic, который изменяется во время выполнения. – Eyal

ответ

2

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); 
+1

Спасибо, мне было неудобно, что в режиме отладки я вижу массив с определенным общим типом, который содержит объекты другого типа, но когда я читаю о стирании стилей, все имеет смысл - массивы на самом деле не имеют типа во время выполнения. – Eyal

Смежные вопросы