Взаимодействие в типе аргумента интерфейса

64
5

Я пытаюсь получить базовую реализацию запроса в качестве типа аргумента функции интерфейса.

И тогда различные классы расширяют базовый класс запроса, чтобы дать более конкретный смысл объекту запроса.

Но Java нуждается в точном классе в качестве аргумента и не соблюдает классы, расширенные этим базовым классом.

public interface MyInterface{
public String getValue(BaseRequest req);
}

public class MyInterfaceImpl implements MyInterface{
public String getValue(SpecificRequest req){ //Java will give a compile error here.
//Impl
}
}

public interface BaseRequest{
int requiredA;
int requiredB;
//setter and getters for A and B
}

public class SpecificRequest extends BaseRequest{
int specificValC;
//setter and getters for C
}

Каков наилучший способ достижения этой картины? Или я слишком много проектирую?

спросил(а) 2021-01-19T17:46:28+03:00 6 месяцев, 2 недели назад
1
Решение
148

Вы можете добиться чего-то подобного с помощью дженериков.

public interface MyInterface<R extends BaseRequest> {
public String getValue(R req);
}

public class MyInterfaceImpl implements MyInterface<SpecificRequest> {
public String getValue(SpecificRequest req){
//Impl
}
}

ответил(а) 2021-01-19T17:46:28+03:00 6 месяцев, 2 недели назад
45

Когда вы реализуете интерфейс, компилятор гарантирует, что ваша реализация верна декларации, т.е. Вы не можете сузить тип параметра до производного класса.

Однако вы можете передать производный класс:

   public class MyInterfaceImpl implements MyInterface {
public String getValue(BaseRequest req){
// ...
}
}

...
// calling your method
MyInterface provider = ...
SpecificRequest request = ...
provider.getValue(request);

ответил(а) 2021-01-19T17:46:28+03:00 6 месяцев, 2 недели назад
46

Ну, если вы объявляете свой интерфейс, как тот, который принимает BaseRequest Java не позволит вам сузить его до некоторого SpecificRequest, это основы OOP. Если вам действительно нужен этот интерфейс, вы должны показать нам примеры других реализаций вашего интерфейса, которые вы собираетесь создать. Я имею в виду, что трудно понять, что ваш дизайн говорит о том, что вы слишком много делаете.

ответил(а) 2021-01-19T17:46:28+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема