我需要编写一个方法,对Object数组进行排序(合并排序(,并具有以下确切的签名:
void mergeSort(Object[] a)
根本不允许使用泛型。
该方法将传递一个协变数组,例如:String[]
或Integer[]
。我现在的问题是,如果没有Comparator,我不知道如何访问这些对象的Comparator或对它们进行排序。对元素进行排序的算法本身并不是问题所在。
我假设该任务旨在向您展示在泛型之前的情况有多糟糕,因为这正是Java<1.5排序数组的签名看起来像:(
由于任务说";自然排序";,这意味着传递的Object实现了具有方法CCD_ 5的CCD_。因此,要访问它,只需将Object
强制转换为Comparable
即可。这正是他们在Java 1.4.2文档中所说的:https://www2.cs.duke.edu/csed/java/jdk1.4.2/docs/api/java/util/Arrays.html#sort(java.lang.Object[](
泛型背后的关键思想是,当您试图将Cactus对象传递到sort()
方法中时,它将在编译时失败,而不是在JVM试图将Cacatus类强制转换为Comparable
接口时在运行时抛出ClassCastException
。
试试这个。
public static void mergeSort(Object[] array) {
@SuppressWarnings("unchecked")
Comparator<Object> comparator = (Comparator<Object>)Comparator.naturalOrder();
Arrays.sort(array, comparator); // Or your own sort logic with `comparator`
}
和
String[] stringArray = {"c", "d", "b", "a", "e"};
mergeSort(stringArray);
System.out.println(Arrays.toString(stringArray));
[a, b, c, d, e]
Integer[] integerArray = {5, 3, 2, 4, 1};
mergeSort(integerArray);
System.out.println(Arrays.toString(integerArray));
[1, 2, 3, 4, 5]
Object[] objectArray = {new Object(), new Object(), new Object()};
mergeSort(objectArray);
System.out.println(Arrays.toString(objectArray));
java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.Comparable...
Object[] mixedArray = {"c", 2, "a", "b", 1, 3};
mergeSort(mixedArray);
System.out.println(Arrays.toString(mixedArray));
java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer...