Как сделать ковариант Consumer<? расширяет базу> работа?
Это наименьший пример кода, который я мог бы предложить для иллюстрации проблемы:
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 ответ
Проблема в том, что Consumer<? extends Base>
является потребителем чего-то, что расширяет Base
, Это может быть Consumer<Derived>
и это не сможет принять Base
в качестве аргумента - это недостаточно конкретно.
Вы можете добавить параметр общего типа, чтобы решить это:
public <T extends Base> void consumeBase(Consumer<T> baseConsumer, T baseParameter) {
baseConsumer.accept(baseParameter);
}
Стоит также отметить, что consumeDerived
сейчас лишнее.