我很长一段时间以来一直在重新学习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中创建泛型类型数组是非法的。如果我尝试实现合并排序,问题只会变得更糟,因为这需要在合并排序方法本身内创建可比较类型的数组。
有没有办法优雅地处理这种情况?
答案 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
数组。请注意,这将创建编译器警告。