Обратный вызов с интерфейсом универсального параметра - PullRequest
2 голосов
/ 20 марта 2019

У меня есть общий интерфейс контейнера, который я использую для абстрагирования Android SparseArray в коде Java:

public interface MyContainer<T> {
    T get(int key);
    void forEach(Consumer<T> consumer);
}

И у меня есть класс с контейнером Implementation, но я хочу толькоexpose Interface извне:

MyContainer<Implementation> data;
Interface get(int key) {
    return data.get(key);
}
void method(Consumer<Interface> callback) {
   data.forEach(callback); //here
}

Но я получаю ошибку компилятора:

error: incompatible types: Consumer<Interface> cannot be converted to Consumer<Implementation>

Как изменить интерфейс MyContainer, чтобы разрешить передачу Consumer<Interface> вмой класс?

1 Ответ

6 голосов
/ 20 марта 2019

В MyContainer аргумент типа Consumer может иметь T в качестве нижней границы.

void forEach(Consumer<? super T> consumer);

Таким образом, то, что потребляет супертип T, может быть передано в качестве аргумента.

Для самого Consumer, если он может обрабатывать супертип T, то он также может обрабатывать T. Это часть PECS - Продюсер продлевает, Consumer Super.

Затем в method вы можете передать Consumer<Interface> в forEach. Здесь T равно Implementation. Тип Interface является супертипом к Implementation, поэтому это допускается нижней границей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...