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



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

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现在是多余的。

相关内容

  • 没有找到相关文章

最新更新