我有一个界面:
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
的类型,它实现了Message<Foo>
,并说T
是Foo
。你需要返回一个Mono<Foo>
。
看起来你的方法不应该是通用的,因为被调用者决定使用什么类型:
private Mono<FulfilmentReleasedDomModel> getDomainModel(ConsumerRecord<String, String> record) {}
或者,如果您希望使此方法更灵活,以便您可以更改其实现以返回其他内容而不更改其返回类型,则可以使用通用通配符:
private Mono<? extends Message> getDomainModel(ConsumerRecord<String, String> record) {}