- abstract class AbstractThing: У меня есть несколько разных вещей с общими полями.
- class Foo extends AbstractThing: foo — это один из видов
- abstract class AbstractReq : у меня есть запросы, относящиеся к вещам, где предметом запроса является поле (T subject)
- FooReq extends AbstractReq: запросы, касающиеся foos, в частности
- FooReqDto: класс DTO со всеми полями в FooReq, сглаженный
java.lang.ClassCastException: class com.example.test.TempTest$AbstractThing$ByteBuddy$ PsTTXfw5 нельзя привести к классу com.example.test.TempTest$Foo (com.example.test.TempTest$AbstractThing$ByteBuddy$PsTTXfw5 и com.example.test.TempTest$Foo находятся в безымянном модуле загрузчика "app")< /p>
Чего мне не хватает при создании карты типов? Кажется, что нет какой-либо внутренней проблемы с классами сопоставления, в которых задействовано наследование и дженерики, поскольку это работает, когда сопоставления нет. И фактические сопоставления, которые я использую, работали нормально до того, как я извлек абстрактные классы (что необходимо, чтобы сократить количество дублирующегося кода).
Вот полный код:
package com.example.test;
import org.junit.Test;
import org.modelmapper.ModelMapper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TempTest {
@Test
public void testStuff() {
final ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(FooReq.class, FooReqDto.class)
.addMappings(map -> {
map.map(req -> req.getSubject().getFooField(), FooReqDto::setSomethingDifferent);
});
final FooReq req = new FooReq();
req.setSubmitted(true);
req.getSubject().setName("testFoo");
req.getSubject().setFooField("bar");
final FooReqDto dto = mapper.map(req, FooReqDto.class);
assertTrue(dto.isSubmitted());
assertEquals("testFoo", dto.getSubjectName());
assertEquals("bar", dto.getSomethingDifferent());
}
public static abstract class AbstractThing {
private String name;
// getters and setters omitted
}
public static class Foo extends AbstractThing {
private String fooField;
// getters and setters omitted
}
public static abstract class AbstractReq {
protected T subject;
private boolean submitted;
// getters and setters omitted
}
public static class FooReq extends AbstractReq {
public FooReq() {
super();
subject = new Foo();
}
}
public static class FooReqDto {
private boolean submitted;
private String subjectName;
private String somethingDifferent;
public FooReqDto() {
}
// getters and setters omitted
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-generic
Мобильная версия