java - 如何使协变消费者工作?
问题描述
这是我能想出的用于说明问题的最小代码示例:
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()
应该能够采用 typeBase
或 type Derived extends Base
。
但是我得到错误:java: incompatible types: Base cannot be converted to capture#1 of ? Base
。
我需要做什么才能完成这项工作?
解决方案
问题在于,它是扩展 a的东西Consumer<? extends Base>
的消费者。它可能是 a ,并且不能接受 a作为参数 - 它不够具体。Base
Consumer<Derived>
Base
您可以添加一个泛型类型参数来解决这个问题:
public <T extends Base> void consumeBase(Consumer<T> baseConsumer, T baseParameter) {
baseConsumer.accept(baseParameter);
}
还值得注意的是,consumeDerived
现在是多余的。
推荐阅读
- firebase - 在 React 中使用 Google Provider 重新验证 Firebase 用户
- python - 如何更正此 python dfs 搜索?
- vb.net - vb.net - 如何从任何驱动器打开应用程序
- vba - 我收到一条类型匹配错误的错误消息
- android - 约束布局响应式设计问题 - android(已关闭)
- teamcity - Teamcity - 如果任何代码更改包含某些字符/单词,则构建失败?
- java - 通知总是创建新的活动,而不是恢复以前的活动
- sql - sqlite3 选择同时引用另一列的列
- linux-kernel - 树莓派如何知道要加载哪个设备树 blob (dtb)?
- flutter - 如何处理不需要的小部件构建?