Как использовать Generi c ограниченный параметр в методе - PullRequest
2 голосов
/ 21 марта 2020

Я пытаюсь написать какой-то общий c код и сталкиваюсь с проблемой. Вот код

public abstract class AbstractService<D extends IDTO> {
    public String ex(D dto) {
        return null;
    }
}


public class AService extends AbstractService<TestA> {
    @Override
    public String ex(TestA dto) {
        return "a";
    }
}

public class BService extends AbstractService<TestB> {
    @Override
    public String ex(TestB dto) {
        return "b";
    }
}

class TestA impements IDTO {
}

class TestB impements IDTO {
}

Итак, как вы можете видеть, это действительно простой код, один AbstractService с ограниченным параметром, который расширяет IDTO. Две реализации службы AService и BService, которые используют их соответствующие DTO.

Не существует другого класса, которому нужно вызывать метод ex() на основе экземпляра времени выполнения. здесь я сталкиваюсь с проблемой.

public class TestAll {
    public void executeRequest(final IDTO dto){
        // serviceMap contains list of all Services here A and B
        serviceMap.get(type).ex(dto);
    }
}

Проблема в построении линии ().

Метод build (capture # 5-of? Extends IDTO) в типе AbstractService не применим для аргументов (IDTO)

Может ли кто-нибудь помочь решить эту проблему?

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Я нашел причину, по которой это выдало мне ошибку. Это была моя ошибка, так как я пытался построить карту с помощью Spring и использовал ограниченный подход.

Это был мой предыдущий код.

    @Autowired
    public void setServicesList(List<AbstractService<IDTO>> abstractServices) {
        serviceMap = abstractServices.stream().collect(Collectors.toMap(AbstractService::getType, Function.identity()));
    }

и мне пришлось убрать ограниченный подход, и теперь он работает.

    public void setServicesList(List<AbstractService> abstractServices) {
        serviceMap = abstractServices.stream().collect(Collectors.toMap(AbstractService::getType, Function.identity()));
    }
0 голосов
/ 21 марта 2020

Если вы знаете, какой тип сервиса содержит Map, вы можете сделать следующее:

// define your service map
private final Map<String, AbstractService<? extends IDTO>> serviceMap = Map.of(
        "a", new AService(),
        "b", new BService());

// cast `AbstractServise` from the map into required type:
public void executeRequest(final TestA dto){
    ((AbstractService<TestA>)serviceMap.get("a")).ex(dto);
}

public void executeRequest(final TestB dto){
    ((AbstractService<TestB>)serviceMap.get("b")).ex(dto);
}
...