Интерфейс Java расширяет Comparable - PullRequest
16 голосов
/ 09 февраля 2010

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

Ответы [ 2 ]

19 голосов
/ 09 февраля 2010

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

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

Так что попробуйте:

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

или

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

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

2 голосов
/ 09 февраля 2010

Если вы используете сопоставимое, вам не нужно указывать возможность для подтипов в функции сравнения, по природе возможно передать любой подтип объекта 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...