在Herbert Schildt的“Java the Complete Reference”(第10版)中,在关于泛型的第14章中,有一个通用方法的例子,用于检查对象是否在数组中:
class GenMethDemo {
static <T extends Comparable<T>, V extends T> boolean isIn(T x, V[] y) {
. . .
}
. . .
}
我不明白为什么V extends T
在这里使用。
为什么我们允许数组的类型成为我们检查成员身份的对象的 sub 类?不应该是相反的吗?
答案 0 :(得分:2)
在这种情况下,V
需要是T
的子类,因为您要在Comparable
上调用V[]
方法。如果您允许V
成为T
的超级类型(例如对象[]),则无法调用compareTo
,因为这些方法尚未实现。
答案 1 :(得分:2)
经过一些修补,我能够回答我的问题。
事实上,正如@ m-le-rutte所说,V
需要扩展T
以确保它们都实现Comparable<T>
。但是,这有点不合逻辑,因为它允许我们检查超类对象是否为子类数组的成员资格,但不是相反。
以下是扭转局势的方法:
public class GenMethDemo {
static <V extends Comparable<V>, T extends V> boolean isIn(T x, V[] y) {
. . .
}
. . .
}
正如我所知,类型参数的顺序不必与方法参数的顺序相同。
是否可以创建一个允许T extends V
和V extends T
的单一声明,只要它们都实现了高级Comparable<>
,我不知道,但是怀疑。
<强> ADDITION 强>:
正如@lexicore所提到的,以下似乎也有效:
public class GenMethDemo {
static <T extends Comparable<T>> boolean isIn(T x, T[] y) {
. . .
}
. . .
}
它也支持x
作为y[]
的子类型。