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