Это верно - помните, что вызывающая сторона не должна знать, какая конкретная реализация интерфейса используется.Они просто знают, что могут передать Request
( любой запрос) в processRequest
, в то время как ваша реализация налагает более строгое ограничение на аргумент, что приведет к тому, что определенные вызовы методов не будут корректными по типу.
Если вы хотите сделать это, вам нужно добавить в интерфейс универсальный параметр, например:
interface Processor<R extends Request> {
void processRequest(R r);
}
public class SpecialProcessor implements Processor<SpecialRequest> {
public void processRequest(SpecialRequest r) { ... }
}
Таким образом, вызывающие абоненты, которые хотят передать "обычные запросы должны будут объявить переменную / поле типа Processor<Request>
- и ваш SpecialProcessor больше не соответствует этой границе, поэтому не может быть назначен и будет корректно отклонен во время компиляции.Вызывающие абоненты, которые имеют дело со специальными запросами, могут использовать переменную / поле Processor<SpecialRequest>
, которой может быть назначен ваш класс .