Как сделать ковариантный потребительРабота? - PullRequest
0 голосов
/ 08 июня 2018

Это наименьший пример кода, который я мог бы предложить для иллюстрации проблемы:

public void consumeDerived(Consumer<Derived> derivedConsumer, Derived derivedParameter) {
    consumeBase(derivedConsumer, derivedParameter);
}

public void consumeBase(Consumer<? extends Base> baseConsumer, Base baseParameter) {
    baseConsumer.accept(baseParameter);
}

Идея состоит в том, что вызов consumeDerived просто передается методу consumeBase.Насколько я понимаю, вызов baseConsumer.accept() должен быть в состоянии принять тип Base или тип Derived extends Base.

Однако я получаю сообщение об ошибке: java: incompatible types: Base cannot be converted to capture#1 of ? Base.

Что мне нужносделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 08 июня 2018

Проблема в том, что Consumer<? extends Base> является потребителем чего-то , что расширяет Base.Это может быть Consumer<Derived>, и он не сможет принять Base в качестве аргумента - он недостаточно конкретен.

Вы можете добавить параметр общего типа для решения этой проблемы:

public <T extends Base> void consumeBase(Consumer<T> baseConsumer, T baseParameter) {
    baseConsumer.accept(baseParameter);
}

Стоит также отметить, что consumeDerived теперь излишен.

...