Java Comparable - пользовательское сравнение с последствиями - PullRequest
0 голосов
/ 24 января 2020

У меня есть вопрос, касающийся определенного c переопределения CompareTo.

class Sjavac {
static class A implements Comparable<A> {
    @Override
    public int compareTo(A a) {
        return 1;
    }

    @Override
    public String toString() {
        return this.getClass().toString();
    }
}

static class B extends A {
    @Override
    public int compareTo(A a) {
        return 1;
    }
}

public static void main(String[] args) {
    List<A> list = new ArrayList<>();
    list.add(new A());
    list.add(new B());
    Collections.sort(list);
    for(A a : list){
        System.out.println(a);
    }
}
}

В результате я получаю, что сначала печатается строка A, а затем B.

Мой вопрос есть, почему это результат? Что именно происходит в этом случае? Когда A сравнивается с B, оно считается больше, а когда B сравнивается с A, оно считается больше. Чем определяется этот порядок?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Вы сравниваете B с A, и возвращение B должно следовать после A (в сравнении B с методом). Кроме того, вы сравниваете А с А и говорите, что первый должен следовать за вторым (в сравнении А с методом). Затем у вас есть список с объектом A и объектом B. Сортировка это, A сравнивается с B, B больше (приходит позже), и это возвращается.

Здесь произошел трюк, почему метод Collections.sort выбирает реализацию B сравнения To? Потому что уже поздно связывать! Это наследство. Проверьте эту реализацию с консольной печатью ...

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Sjavac {
static class A implements Comparable<A> {
    @Override
    public int compareTo(A a) {
        System.out.println("A");
        return 1;
    }

    @Override
    public String toString() {
        return this.getClass().toString();
    }
}

static class B extends A {
    @Override
    public int compareTo(A a) {
        System.out.println("Here");
        return 1;
    }
}

public static void main(String[] args) {
    List<A> list = new ArrayList<>();
    list.add(new A());
    list.add(new B());
    Collections.sort(list);
    for(A a : list){
        System.out.println(a);
    }
}
}
0 голосов
/ 24 января 2020

В этом случае результат не определен, потому что вы не можете отсортировать список, где элементы меняются. Итак, если вы хотите знать, почему это результат, вы должны проверить, как работает алгоритм сортировки.

...