使用“超级”和“?”在Java中

时间:2013-07-24 22:30:15

标签: java generics bounded-wildcard

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

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

<? super PopulationLoadContext>是什么意思?

3 个答案:

答案 0 :(得分:8)

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

它可以是LoadTarget<PopulationLoadContext>,也可以是LoadTarget<Object>,或介于两者之间的任何内容(如果在类之间存在)。

答案 1 :(得分:1)

它是什么?

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

它允许什么?

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

<强>为什么吗

为了保证灵活性 - 一系列不同的实例化类型可以互相替代并且工作正常。在LoadTarget内,type参数用于方法参数(输入)或内部实例化泛型类型的上部类型边界。在这些情况下,更广泛的类型可以替代原始类型,因为它更容易适应。据说泛型类型与其类型参数

具有逆差

答案 2 :(得分:1)

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

“给定List<? extends Foo>,然后可以检索元素并将其安全地分配到Foo类型(协方差)。给定List<? super Foo>,然后Foo对象可以安全地添加为元素(逆向)。“