我有一个界面:
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>
?
答案 0 :(得分:1)
关于泛型的一个常见误解是被调用者确定泛型的类型。不,呼叫者可以。
作为方法的作者,您不必确定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) {}