使用Comparable转换Object的实例

时间:2018-05-31 15:35:46

标签: java oop object comparable

我正在查看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++];
    }
}

2 个答案:

答案 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,因此它是安全的。