Приведение экземпляра объекта с сопоставимым - PullRequest
0 голосов
/ 31 мая 2018

Я искал метод слияния, и у меня есть несколько вопросов.Существует приведение объекта в 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 голосов
/ 31 мая 2018

Это частично из-за похмелья со старых времен до дженериков, когда многие из основных функций Java принимали Object в качестве параметров, и вам приходилось приводить вещи повсюду.

Кроме того, *Класс 1004 * также может сортировать внутренние вещи, такие как int и т. Д.

. Здесь происходит то, что mergeSort предполагает, что объект реализует Comparable , и вызывает его compareTo метод.Это предположение вызовет сбой быстро ClassCastException , так что это неплохое предположение.

TLDR: В большинстве случаев объект будет реализовывать Comparable так что это безопасно.

0 голосов
/ 31 мая 2018

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
...