compareTo()与泛型类型

时间:2015-03-22 15:42:19

标签: java generics generic-programming

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

我已经定义了一个可以容纳泛型类型元素的数组。现在我将数组[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(捕获#1-of?)   可比较不适用于论点   (比较)

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

3 个答案:

答案 0 :(得分:2)

Comparable<?>意味着你不知道你得到了什么样的Comparable;您可能会收到Comparable<Object>,除非您明确覆盖{em> 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. } 方法的签名以接受类似的绑定。

{{1}}

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

一个简单的

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