Должен ли Comparable когда-либо сравниваться с другим типом?

Мне интересно, есть ли когда-нибудь действительный вариант использования для следующего:

class Base {}

class A implements Comparable<Base> {
    //...
}

Кажется, это общая закономерность (см.Коллекции для ряда примеров) принять коллекцию типаT, гдеT extends Comparable<? super T>.

Но кажется технически невозможным выполнить контрактcompareTo() при сравнении с базовым классом, потому что нет способа гарантировать, что другой класс не расширит базовый с противоречивым сравнением. Рассмотрим следующий пример:

class Base {
    final int foo;
    Base(int foo) {
        this.foo = foo;
    }
}

class A extends Base implements Comparable<Base> {
    A(int foo) {
        super(foo);
    }
    public int compareTo(Base that) {
        return Integer.compare(this.foo, that.foo); // sort by foo ascending
    }
}

class B extends Base implements Comparable<Base> {
    B(int foo) {
        super(foo);
    }
    public int compareTo(Base that) {
        return -Integer.compare(this.foo, that.foo); // sort by foo descending
    }
}

У нас есть два класса расширенияBase используя сравнения, которые не следуют общему правилу (если бы было общее правило, оно почти наверняка было бы реализовано вBase). Тем не менее будет скомпилирован следующий сломанный вид:

Collections.sort(Arrays.asList(new A(0), new B(1)));

Разве не было бы безопаснее принимать толькоT extends Comparable<T>? Или есть какой-то вариант использования, который будет проверять подстановочный знак?

Ответы на вопрос(2)

Ваш ответ на вопрос