如何使协变消费者<?扩展基地>工作?
How to make covariant Consumer<? extends Base> work?
这是我能想到的用于说明问题的最小代码示例:
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
现在是多余的。
这是我能想到的用于说明问题的最小代码示例:
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
现在是多余的。