F界多态Java

时间:2019-03-22 06:34:36

标签: java type-conversion type-erasure

我有一个界面:

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>

1 个答案:

答案 0 :(得分: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) {}