有没有办法使用Java泛型类型来编写排序算法?

时间:2014-09-21 19:43:14

标签: java sorting generics

我很长一段时间以来一直在重新学习Java,而且我正在尝试编写一些排序算法。我使用的(相当过时的)教科书使用Comparable接口对对象进行排序。由于可比较对象现在是通用类型,因此这样做会在编译时给出很多关于原始类型的警告。经过一些研究,看起来我可以做类似的事情,例如:

public class Sorting
{
    public static <T extends Comparable<T>> void quickSort(T[] list, int start, int end)
    {
        /*...*/
        while((list[left].compareTo(list[pivot]) < 0) && (left != right)) // for example
            left++;
        /*...*/
    }
}

问题在于调用此方法的天真方式不起作用:

public class SortingTest
{
    public static void main(String[] args)
    {
        // Produces an error, cannot create arrays of generic types
        Comparable<Integer>[] list = new Comparable<Integer>[100];

        /* fill the array somehow */

        Sorting.quickSort(list, 0, 99);
    }
}

在Java中创建泛型类型数组是非法的。如果我尝试实现合并排序,问题只会变得更糟,因为这需要在合并排序方法本身内创建可比较类型的数组。

有没有办法优雅地处理这种情况?

2 个答案:

答案 0 :(得分:3)

请注意T 扩展 Comparable<T>。它不必 Comparable<T>

因此,您可以创建一个整数数组,因为Integer实现了Comparable<Integer>

Integer[] list = new Integer[100];
/* fill the array somehow */
Sorting.quickSort(list, 0, 99);

答案 1 :(得分:0)

您必须创建一个Object数组,然后转换为T数组。请注意,这将创建编译器警告。