java - F 有界多态 Java 中的返回类型
问题描述
我有一个界面:
public interface Message<T extends Message<T>> {
}
我有一个实现这个方法的类
public class FulfilmentReleasedDomModel implements Message<FulfilmentReleasedDomModel> {}
我有这个方法:
private <T extends Message<T>> Mono<T> getDomainModel(ConsumerRecord<String, String> record) {}
当我尝试Mono<FulfilmentReleaseDomModel>
从该方法返回一个类型的对象时,编译器会抛出一个错误并要求我将其强制转换为 ( Mono<T>
)。
我的问题是,既然我已经绑定T
到extends Message
并FulfilmentReleasedDomModel
实现Message<FulfilmentReleasedDomModel>
了,为什么我需要将它转换为Mono<T>
?
解决方案
关于泛型的一个常见误解是被调用者决定泛型类型是什么。不,来电者会。
作为该方法的作者,您无法决定是什么T
。通过返回Mono<FulfilmentReleasedDomModel>
,您是在说T
必须FulfilmentReleasedDomModel
。但实际上,您的方法的调用者将决定是什么T
。他们可以声明一个名为Foo
implements的类型,Message<Foo>
并说它T
是Foo
. 您需要返回 a Mono<Foo>
。
看起来你的方法不应该是通用的,因为被调用者正在决定使用什么类型:
private Mono<FulfilmentReleasedDomModel> getDomainModel(ConsumerRecord<String, String> record) {}
或者,如果您想使此方法更灵活,以便您可以更改其实现以返回其他内容而不更改其返回类型,则可以使用通用通配符:
private Mono<? extends Message> getDomainModel(ConsumerRecord<String, String> record) {}
推荐阅读
- angular - Angular 发布请求并导航到新组件
- javascript - 从@input 值单击的所有复选框
- regex - 正则表达式在我的 bash 脚本中触发了一个“意想不到的令牌”,但我可以说它看起来不错。我究竟做错了什么?
- python - chrome 无法同时使用无头模式和 chrome 配置文件路径启动
- javascript - VUE NPM 导入包到所有其他文件
- qt - 为什么 qtcreator 不能运行这个?
- compare - Cognito - 重置密码检查以前的密码
- react-native - React native:组件没有从渲染中返回(UiKitten)
- mysql - 如何查看 MySQL 的 InnoDB 生成的 B-tree 索引结构?
- php - 使用 lrlaravel eloquent 为用户获取平均评分