Я хочу иметь интерфейс A
параметризованный T
A<T>
, и также хочу каждый класс, который реализует его, чтобы также реализовать Comparable
(с T
и его подтипы). Казалось бы естественным записать interface A<T> extends Comparable<? extends T>
, но это не работает. Как я должен сделать это затем?
Когда появляется Comparable extends T>
, это означает, что у вас есть экземпляр Comparable
, который можно сравнить с одним (неизвестным) подтипом T
, а не то, что его можно сравнить с любым подтипом T.
Но вам это не нужно, потому что Comparable
может сравнивать себя с любым подтипом T
, например, Comparable
может сравнивать себя с Comparable
.
Поэтому попробуйте:
interface A<T> extends Comparable<T> {
// ...
}
или
interface A<T extends Comparable<T>> extends Comparable<A<T>> {
// ...
}
в зависимости от того, нужна ли вам возможность сравнивать экземпляры T
для реализации вашего метода compareTo
.
Если вы используете сопоставимый, вам не нужно указывать возможность для подтипов в функции сравнения, по своей природе можно передать любой подтип объекта 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);
}
}