首页 > 解决方案 > 如何使协变消费者工作?

问题描述

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

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()应该能够采用 typeBase或 type Derived extends Base

但是我得到错误:java: incompatible types: Base cannot be converted to capture#1 of ? Base

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

标签: javacovariancevariance

解决方案


问题在于,它是扩展 a的东西Consumer<? extends Base>的消费者。它可能是 a ,并且不能接受 a作为参数 - 它不够具体。BaseConsumer<Derived>Base

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

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

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


推荐阅读