这是我能想到的最小的代码示例来说明这个问题:
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
现在是多余的。