使用泛型方法检查对象是否在数组中

时间:2018-04-17 17:39:40

标签: java arrays generics

在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 类?不应该是相反的吗?

2 个答案:

答案 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 VV extends T的单一声明,只要它们都实现了高级Comparable<>,我不知道,但是怀疑。

<强> ADDITION

正如@lexicore所提到的,以下似乎也有效:

public class GenMethDemo {
    static <T extends Comparable<T>> boolean isIn(T x, T[] y) {
        . . .
    }

    . . .
}

它也支持x作为y[]的子类型。