我正在查看mergeSort方法,我有一些问题。 有一个Object into Comparable,这是一个接口。
((Comparable)dest[j-1]).compareTo((Comparable)dest[j])
当存在强制转换接口时编译器究竟做了什么?
.compareTo
类中未定义Object
方法。
接口只有抽象方法。如何在Object中使用?
private static void mergeSort(Object src[], Object dest[], int low, int high) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < 7) {
for (int i=low; i<high; i++)
for (int j=i; j>low && ((Comparable)dest[j-1]).compareTo((Comparable)dest[j]) >0; j--)
swap(dest, j, j-1);
return;
}
// Recursively sort halves of dest into src
int mid = (low + high)/2;
mergeSort(dest, src, low, mid);
mergeSort(dest, src, mid, high);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (((Comparable)src[mid-1]).compareTo((Comparable)src[mid]) <= 0) {
System.arraycopy(src, low, dest, low, length);
return;
}
// Merge sorted halves (now in src) into dest
for(int i = low, p = low, q = mid; i < high; i++){
if (q>=high || p<mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
答案 0 :(得分:1)
dest[j-1]
是一个引用,它引用Object
,此Object
可能已实现Comparable
。
使用(Comparable)dest[j-1]
,您告诉编译器相信我,我是可比较的。
在运行时,如果这个对象具有可比性,那很好。不会,ClassCastException
会被抛出。
Object o = 1; // Integer is Comparable
System.out.println(((Comparable)(o)).compareTo(0)); // 1
Object o = new ArrayList<Integer>(); // ArrayList is not Comparable
System.out.println(((Comparable)(o)).compareTo(0)); // ClassCastException
答案 1 :(得分:0)
部分原因是由于许多核心Java函数将Object
作为参数并且你不得不在所有地方投射内容,因此从泛型之前的遗留事件中解脱了。
此外,Arrays
类还可以对int
等内在事物进行排序。
这里发生的是mergeSort
假设对象实现Comparable并调用它的compareTo
方法。这个假设会导致快速失败 ClassCastException,所以这不是一个错误的假设。
TLDR:在大多数情况下,对象将实施Comparable
,因此它是安全的。