【问题标题】:Use of "super" with "?" in Java [duplicate]将“超级”与“?”一起使用在Java中[重复]
【发布时间】:2013-07-25 07:13:52
【问题描述】:

我正在尝试阅读和理解一些 Java 代码。这里是:

protected LoadTarget<? super PopulationLoadContext> createTarget(PopulationLoadContext context) {
    return createTransactionalTargetGroup(RiskScoresTables.All_Tables);
}

&lt;? super PopulationLoadContext&gt; 是什么意思?

【问题讨论】:

标签: java generics bounded-wildcard


【解决方案1】:

在 Java 中,这是一个 lower-bounded wildcard in generics,代表 PopulationLoadContext 或该类的任何超类。

它可以是LoadTarget&lt;PopulationLoadContext&gt;,也可以是LoadTarget&lt;Object&gt;,或者介于两者之间的任何东西(如果存在类之间的话)。

【讨论】:

  • @RichardW 一个很好的资源——我已经链接了。
【解决方案2】:

这是什么?

正如 rgettman 所说,它是一个泛型类型 LoadTarget,其类型参数设置为下界通配符。

它允许什么?

在运行时,LoadTarget 变量可以用相同类型的值替换(设置​​),其中类型参数是 PopulationLoadContext 或祖先。

为什么?

为了实现灵活性 - 一系列不同的实例化类型可以相互替换并正常工作。在LoadTarget 中,类型参数用于方法参数(输入)或内部实例化泛型类型的类型上限。在这些情况下,更广泛的类型可以替代原始类型,因为它更适应。据说泛型类型与它的类型参数具有逆变性

【讨论】:

    【解决方案3】:

    更一般地说(不仅仅是 Java 而言),如果你想获得更大的图景,它也被称为 协变/逆变http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 参见 Java 部分:

    "给定一个List&lt;? extends Foo&gt;,然后一个元素可以被检索并安全地分配给一个Foo类型(协方差)。给定一个List&lt;? super Foo&gt;,那么一个Foo对象可以是安全地添加为元素(逆变)。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2020-03-27
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2020-05-05
      • 2017-08-16
      相关资源
      最近更新 更多