F-Bounded多态Java中的返回类型

问题描述 投票:0回答:1

我有一个界面:

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>

java type-conversion type-erasure
1个回答
1
投票

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

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

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

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

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

private Mono<? extends Message> getDomainModel(ConsumerRecord<String, String> record) {}
© www.soinside.com 2019 - 2024. All rights reserved.