ModelMapper: Как отобразить в Список общих экземпляров известного конкретного типа - PullRequest
1 голос
/ 16 октября 2019

Я хочу преобразовать с ModelMapper a List<> в List<T>, зная точное java.lang.Class из T. Но ModelMapper сохраняет только создание экземпляра общего родительского класса T ...

для вашего контекста: я хочу преобразовать список DTO в список Domain, но, как я делаю это в каждом извлеченном классе Serviceэто в общем абстрактном Сервисе.

public class BaseClass {}
public class SubClass1 extends BaseClass {}

public <T extends BaseClass> List<T> getList(Class<T> specificClass) {
    ...
    Type listType = new TypeToken<List<T>>(){}.getType(); // here problem

    List<T> responseList = modelMapper.map(listIAlreadyHave, listType);

    return responseList;
}

List<SubClass1> list = doIt(SubClass1.class);

Вдохновение здесь

Я бы хотел, чтобы список был списком SubClass1 экземпляров, но я получаю только BaseClass экземпляры. Я не виню Java за то, что он не понимает мое определение listType, потому что T неизвестно во время выполнения, но как я могу использовать параметр specificClass, который я щедро предоставляю?

Спасибо, уважаемое сообщество!

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Когда вызывается универсальный метод, типы уже стираются, а TypeToken захватывает универсальный тип List<T>.

Метод определен с T extends BaseClass, и поэтому преобразование выполняется для этого класса. Если вы удалите расширения, он преобразует ваш класс данных в себя.

Один из способов решения вашей проблемы - перехватить тип перед удалением: это можно сделать до вызова универсального метода.

public class BaseClass {}
public class SubClass extends BaseClass {}
public class OtherClass {}

public <T extends BaseClass> List<T> getList(Type listType, List<?> listIAlreadyHave) {
    return new ModelMapper().map(listIAlreadyHave, listType);
}

List<OtherClass> listIAlreadyHave = buildList();

// Capture type before erasure
Type listType = new TypeToken<List<SubClass>>() {}.getType();

List<SubClass> list = getList(listType, listIAlreadyHave);;
0 голосов
/ 16 октября 2019

Вы можете использовать явное сопоставление и указать, как преобразователь должен преобразовывать один экземпляр в другой. Разве вы не хотели сделать SubClass1 расширенным BaseClass? Если бы вы хотели, чтобы вы могли просто воспользоваться полиморфизмом.

Хорошего дня!

...