Интерфейс Java расширяет Comparable

Я хочу иметь интерфейс A, параметризованный T A<T>, а также каждый класс, который его реализует, также реализовать ComparableT и его подтипами). Казалось бы, естественно написать interface A<T> extends Comparable<? extends T>, но это не сработает. Как мне это сделать?

Ответ 1

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

Но вам это не нужно, потому что Comparable<T> может сравнивать себя с любым подтипом T в любом случае, например. a Comparable<Number> может сравниться с a Comparable<Double>.

Итак, попробуйте:

interface A<T> extends Comparable<T> {
    // ...
}

или

interface A<T extends Comparable<T>> extends Comparable<A<T>> {
    // ...
}

в зависимости от того, нужно ли вам сравнивать экземпляры T, чтобы реализовать ваш метод compareTo.

Ответ 2

Если вы используете сопоставимые данные, вам не нужно указывать возможность подтипов в функции сравнения, по своей природе можно передать любой подтип объекта X в метод, объявляющий параметр класса X. См. код ниже для получения дополнительной информации.

public interface Test<T> extends Comparable<T> {

}

class TestImpl implements Test<Number> {
    @Override
    public int compareTo(final Number other) {
        return other.intValue() - 128;
    }
}

class TestMain {
    public static void main(final String[] args) {
        TestImpl testImpl = new TestImpl();
        testImpl.compareTo(Integer.MIN_VALUE);
    }
}