具有通用类型的 compareTo()

compareTo() with generic type

我定义了一个可以容纳泛型元素的数组。现在我将 array[index] 与另一个可比较的元素进行比较。下面是代码片段。

我定义了一个可以容纳泛型元素的数组。现在我将 array[index] 与另一个可比较的元素进行比较。下面是代码片段。

public class Test {
    void methodArr(){
        final Comparable[] arr = { 1, 2, 3, 4, 5};
        Integer item = 10;

        compare(arr, item);
    }


    private int compare(Comparable<?>[] arr, Comparable<?> item) {
        return arr[0].compareTo(item);   //Error in this line
    }
}

现在它给出方法 compare() 中的错误

arr[0].compareTo(item)

错误是:

The method compareTo(capture#1-of ?) in the type comparable is not applicable for the arguments (Comparable)

我不明白我哪里弄错了?我的目标是方法 compare() 应该将数组作为可比较类型的元素。

Comparable<?> 意味着你不知道你得到的是什么Comparable;您可能会得到 Comparable<Object>,除非您为 Object.

that 实例显式覆盖 compareTo,否则它不起作用

正确的解决方法是在方法中引入一个类型参数,这样你关心的类型就绑定到 Comparable

private <T extends Comparable<T>> int compare(T[] arr, T item) {
    return arr[0].compareTo(item);
}

以上仍然适用于 Comparable[],而不是 Comparable<?>[]。泛型和数组不能很好地混合使用,因此尽可能避免将两者结合使用。

如果你想避免未经检查的警告(由于数组协方差,此时可以安全地忽略),那么你将修改你的 methodArr 方法的签名以接受类似的绑定。

<T extends Comparable<T>> void methodArr(final T[] arr, T item) {
    // use the passed-in arr and item variables instead.
}

您参数中的两个通配符之间没有任何关系。相反,您应该使用显式类型变量指定它们是同一类型:

private <T extends Comparable<T>> int compare(T[] arr, T item) {

一个简单的

private <T extends Comparable>  int compare(T[] arr, T item) {
        return arr[0].compareTo(item);   
    }