Интерфейс Java расширяется Сопоставимый

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

16
задан Joachim Sauer 24 August 2012 в 11:06
поделиться

2 ответа

Когда появляется Comparable, это означает, что у вас есть экземпляр 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.

20
ответ дан 30 November 2019 в 22:02
поделиться

Если вы используете сопоставимый, вам не нужно указывать возможность для подтипов в функции сравнения, по своей природе можно передать любой подтип объекта 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);
    }
}
2
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: