Java Dynami c Polymorphi c Возможно ли преобразование типа с карты без приведения? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь преобразовать набор различных типов, использующих общий интерфейс, в другой набор типов, которые также используют другой общий интерфейс.

Типичным случаем использования этого является отображение полиморфа c сущность для различных различных DTO. Давайте предположим, что каждый конкретный тип имеет соответствующий DTO, в который он должен быть преобразован, и каждое преобразование уникально и задает c для этого типа.

Представьте себе интерфейс Vehicle с Car и Boat реализации, которые должны быть преобразованы в CarDTO и BoatDTO соответственно:

public class VehicleConverter {

    private Map<Class<? extends Vehicle>, Function<Vehicle, DTO>> converters;

    public VehicleConverter() {
        this.converters = new HashMap<>();

        converters.put(Car.class, v -> convertCar((Car) v));
        converters.put(Boat.class, v -> convertBoat((Boat) v));
    }

    public DTO convert(Vehicle v) {
        return converters.get(v.getClass()).apply(v);
    }

    private CarDTO convertCar(Car car) {
        // do something car-specific
        return new CarDTO();
    }

    private BoatDTO convertBoat(Boat boat) {
        // do something boat-specific
        return new BoatDTO();
    }
}

Как вы можете видеть, я «регистрирую» каждое преобразование типов в Map с ключом Class, но мне все еще нужно вручную привести предоставленный Vehicle v в соответствующий подтип.

Есть ли способ обойти это? Есть ли лучший подход к тому, чего я пытаюсь достичь?

Ради аргументации и для простоты я хотел бы контролировать эту логику c вручную и не полагаться на Spring Converters или что-то подобное ModelMapper

...