在Comparable中使用泛型

时间:2010-11-19 20:52:10

标签: java generics

我正在尝试使用Comparable<T>接口在Java中实现泛型。

public static <T> T[] sort(T[] a) {
    //need to compare 2 elements of a
}

假设我想在compareTo界面中覆盖上述类型T的{​​{1}}方法。即我需要比较我的Comparable类型的两个元素,我该怎么做?我不知道我的T类型是什么。

3 个答案:

答案 0 :(得分:9)

您需要在方法上设置类型约束。

public static <T extends Comparable<? super T>> T[] sort (T[] a)
{
         //need to compare 2 elements of a
}

这会强制T类型具有compareTo(T other)方法。这意味着您可以在方法中执行以下操作:

if (a[i].compareTo(a[j]) > 0) }

}

答案 1 :(得分:0)

尝试使用<T extends Comparable<T>>,然后compareTo

答案 2 :(得分:0)

老问题但是......

正如jjnguy回应,你需要使用:

public static <T extends Comparable<? super T>> T[] sort(T[] a) {
  ...
}

请考虑以下事项:

public class A implements Comparable<A> {}
public class B extends A {}

B隐式实现Comparable<A>,而不是Comparable<B>,因此如果使用B,则排序方法无法用于Comparable<T>数组{{1}而不是Comparable<? super T>。更明确一点:

public static <T extends Comparable<T>> T[] brokenSort(T[] a) {
   ...
}

在以下情况下可以正常工作:

A[] data = new A[3];
...
data = brokenSort(A);

因为在这种情况下,类型参数T将绑定到A。以下将产生编译器错误:

B[] data = new B[3];
...
data = brokenSort(B);

因为T无法绑定B,因为B未实现Comparable<B>