Как сделать ковариант 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 сейчас лишнее.

Другие вопросы по тегам