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

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

09-26 21:01