Как я могу проверить тип параметра, реализующего интерфейс? - PullRequest
0 голосов
/ 23 января 2019

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

  • SessionInterface реализовано Session_A и Session_B
  • ConfigInterface реализовано Config_A, а Config_B
  • Session_A должно использовать только объекты Config_A,то же самое с _B

В приложении внедряется реализация сеанса (без конфига).Позже можно внедрить реализацию config, чтобы использовать ее в качестве параметра для метода сеанса run(ConfigInterface config)
В этом методе я хотел бы убедиться, что тип данного параметра соответствует типу, соответствующему сеансу.

Должен ли я использовать getClass(), instanceof или что-то еще, чтобы проверить это?

1 Ответ

0 голосов
/ 23 января 2019

(Вы найдете много дискуссий в этом проблемном пространстве. Я все еще улучшаю свое понимание проблемы такого типа и приветствую любые улучшения этого ответа.)

Один из возможных ответов - использовать шаблон типа PECS (PECS означает Producer Extends и Consumer Super; см. Что такое PECS (Producer Extends Consumer Super)? ).

Вот пример кода:

interface PECS_Supplier<T> {
    T supply();
}

interface PECS_Consumer<T> {
    void consume(T value);
}

public class PECS_Engine {
    public <T> void process(PECS_Supplier<? extends T> supplier, PECS_Consumer<? super T> consumer) {
        T nextValue;
        while ( (nextValue = supplier.supply()) != null )  {
            consumer.consume(nextValue);
        }
    }
}

Обратите внимание на «? Extends T» и «? Super T» в методе процесса.

...