Как избежать generi c в иерархии классов? - PullRequest
1 голос
/ 13 февраля 2020

У меня следующая иерархия классов

   class MyObject {

}

class FirstChild extends MyObject {

}

class SecondChild extends MyObject {

}

class Calculator<T extends MyObject> {
    public Integer calculateValue(T supperObject) {
        return 10;
    }
}

class IntegerCalculator extends Calculator<FirstChild> {
    @Override
    public Integer calculateValue(FirstChild supperObject) {
        return super.calculateValue(supperObject);
    }
}

class SecondChildCalculator extends Calculator<SecondChild> {
    @Override
    public Integer calculateValue(SecondChild supperObject) {
        return super.calculateValue(supperObject);
    }
}


class AbstractUsefulService {
    protected Calculator<? extends MyObject> calculator;

    public AbstractUsefulService(
        Calculator<? extends MyObject> calculator
    ) {
        this.calculator = calculator;
    }
}

class ImplementationOfAbstractUsefulService extends AbstractUsefulService{

    public ImplementationOfAbstractUsefulService(
        SecondChildCalculator calculator
    ) {
        super(calculator);
    }

    public void doJob(){
        calculator.calculateValue(new SecondChild());
    }
}

У меня большая проблема здесь calculator.calculateValue (new SecondChild ()); - требуется ? расширяет MyObject, но нашел SecondChild. Я прочитал много статей и нашел только одно решение и шаблон c для AbstractUsefulService и использую этот шаблон c в ConnectionService, но я не хочу этого делать. Как я могу решить мою проблему без generi c в AbstractUsefulService?

1 Ответ

2 голосов
/ 13 февраля 2020

Как я могу решить мою проблему без generi c в AbstractUsefulService?

Вы не можете, если собираетесь передать calculator в AbstractUsefulService.

Вам необходимо знать, какой тип объекта будет принимать calculator.calculateValue.

Единственный способ сделать это - сохранить ссылку в классе ImplementationOfAbstractUsefulService:

class ImplementationOfAbstractUsefulService extends AbstractUsefulService{
    private final SecondChildCalculator secondChildCalculator;

    public ImplementationOfAbstractUsefulService(
        SecondChildCalculator calculator
    ) {
        super(calculator);
    }

    public void doJob(){
        secondChildCalculator.calculateValue(new SecondChild());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...