【问题标题】:compareTo() with generic type具有泛型类型的 compareTo()
【发布时间】:2015-03-22 15:42:18
【问题描述】:

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

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

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)

错误是:

类型中的方法 compareTo(capture#1-of ?) 可比较的不适用于论点 (可比)

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

【问题讨论】:

  • I have defined an array which can hold element of generic type 你能说明一下你是怎么做到的吗?
  • 所有项目都有一个带有泛型作为参数的 compareTo 吗?
  • @Everv0id 我已经声明了一个整数类型的数组,它是 Comparable 对象。可以在方法methodArr()中看到。
  • 这不是泛型类型 - Integer 非常具体。你有一个Comparable[],因为数组是协变的(也就是说,因为IntegerComparableInteger[]Comparable[])。
  • 如果你声明一个Integer的数组,你将只得到一个整数数组,而不是array which can hold element of generic type

标签: java generics generic-programming


【解决方案1】:

Comparable&lt;?&gt; 表示你不知道你得到的是哪种Comparable;您可能会收到Comparable&lt;Object&gt;,除非您为Object那个 实例显式覆盖compareTo,否则它不起作用。

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

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

以上内容仍然适用于Comparable[],而不是Comparable&lt;?&gt;[]。泛型和数组不能很好地混合,所以尽可能避免将两者结合起来。

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

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

【讨论】:

  • 谢谢诚。很抱歉让大家感到困惑。我必须声明可以容纳任何可比较对象的泛型数组。我刚刚编辑了这个问题。请帮助我解决办法。
  • 当数组是整数类型时,上述解决方案有效。但是在制作了 Comparable>[] 类型的数组后,在 methodArr() 中调用 compare() 方法时出错。
  • 刷新答案。你真的不应该打扰Comparable&lt;?&gt;[]。你不关心Comparable 数组绑定到什么类型,只要它是Comparable。所以干脆忽略它的泛化。
  • 你的意思是它应该是 Comparable[] arr 而不是 Comparable>[] arr?如果是,则使用 Comparable 原始类型会发出警告。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    一个简单的

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

    【讨论】:

    • &lt;T extends Comparable&gt;T 上引入了一个原始类型,并导致编译器发出未经检查的警告,这是我们想要避免的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2015-07-09
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多