如何使协变消费者<?扩展基地>工作?

How to make covariant Consumer<? extends Base> work?

这是我能想到的用于说明问题的最小代码示例:

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

我需要做什么才能完成这项工作?

问题是 Consumer<? extends Base> 某物 的消费者,它扩展了 Base。它可能是 Consumer<Derived>,并且不能接受 Base 作为参数 - 它不够具体。

你可以添加一个泛型类型参数来解决这个问题:

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

还值得注意的是,consumeDerived 现在是多余的。