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

时间:2018-06-08 12:18:39

标签: java covariance variance

这是我用来说明问题的最小代码示例:

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 :(得分:2)

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

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

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

值得注意的是consumeDerived现在已经多余了。