Я хочу иметь интерфейс 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);
}
}