объявить подтип параметра в интерфейсе Java, использовать подтипы в методах реализации Java - PullRequest
3 голосов
/ 27 января 2011

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

interface Processor{
      processRequest( Request r);
}

public class SpecialRequest extends Request{...}

public class SpecialProcessor implements Processor{

      processRequest(SpecialRequest r){...}
}

, но я получаю ошибки в SpecialProcessorпотому что он не правильно реализует интерфейс процессора.Что я могу изменить в интерфейсе процессора, чтобы позволить определению в SpecialProcessor работать?

Ответы [ 2 ]

9 голосов
/ 27 января 2011

Вы можете ввести Processor:

public interface Processor<R extends Request> {
    void processRequest(R r);
}


public class SpecialProcessor implements Processor<SpecialRequest> {
    public void processRequest(SpecialRequest r) {
       ...
    }
}
3 голосов
/ 27 января 2011

Это верно - помните, что вызывающая сторона не должна знать, какая конкретная реализация интерфейса используется.Они просто знают, что могут передать 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>, которой может быть назначен ваш класс .

...