繁体   English   中英

具有通用类型的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(项目)

错误是:

可比较类型的compareTo(capture#1-of?)方法不适用于自变量(Comparable)

我不明白我在哪里犯错? 我的对象是compare()方法应该将数组作为可比较类型的元素。

Comparable<?>表示您不知道要获得哪种Comparable 你可能会得到Comparable<Object>这是不行的,除非你明确覆盖compareTo对于实例Object

正确的解决方案是在方法中引入类型参数,以使您关心的类型绑定到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);   
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM