首页 > 解决方案 > 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>)。

我的问题是,既然我已经绑定Textends MessageFulfilmentReleasedDomModel实现Message<FulfilmentReleasedDomModel>了,为什么我需要将它转换为Mono<T>

标签: javatype-conversiontype-erasure

解决方案


关于泛型的一个常见误解是被调用者决定泛型类型是什么。不,来电者会。

作为该方法的作者,您无法决定是什么T。通过返回Mono<FulfilmentReleasedDomModel>,您是在说T必须FulfilmentReleasedDomModel。但实际上,您的方法的调用者将决定是什么T。他们可以声明一个名为Fooimplements的类型,Message<Foo>并说它TFoo. 您需要返回 a Mono<Foo>

看起来你的方法不应该是通用的,因为被调用者正在决定使用什么类型:

private Mono<FulfilmentReleasedDomModel> getDomainModel(ConsumerRecord<String, String> record) {}

或者,如果您想使此方法更灵活,以便您可以更改其实现以返回其他内容而不更改其返回类型,则可以使用通用通配符:

private Mono<? extends Message> getDomainModel(ConsumerRecord<String, String> record) {}

推荐阅读