【问题标题】:Return Type in F-Bounded Polymorphism JavaF 有界多态 Java 中的返回类型
【发布时间】:2019-03-22 06:34:36
【问题描述】:

我有一个界面:

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&lt;FulfilmentReleaseDomModel&gt; 类型的对象时,编译器会抛出错误并要求我将其转换为 (Mono&lt;T&gt;)。

我的问题是,既然我已经将T 绑定到extends Message,并且FulfilmentReleasedDomModel 实现了Message&lt;FulfilmentReleasedDomModel&gt;,为什么我需要将它转换为Mono&lt;T&gt;

【问题讨论】:

    标签: java type-conversion type-erasure


    【解决方案1】:

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

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

    您的方法似乎不应该是通用的,因为被调用者正在决定使用什么类型:

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

    或者,如果你想让这个方法更灵活,这样你就可以改变它的实现来返回其他东西而不改变它的返回类型,你可以使用通用通配符:

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2016-09-22
      • 1970-01-01
      • 2018-05-20
      • 2020-05-05
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多