Я хочу иметь интерфейс A, параметризованный T A<T>, а также каждый класс, который его реализует, также реализовать Comparable (с T и его подтипами). Казалось бы, естественно написать interface A<T> extends Comparable<? extends T>, но это не сработает. Как мне это сделать?
Интерфейс Java расширяет Comparable
Ответ 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);
}
}