Убедитесь, что объекты реализуют Comparable

У меня проблема с litte, и мне было интересно, как ее решить. У меня есть общий класс Tuple<A,B>, и теперь я хотел бы сортировать их кортежи в соответствии с A и B. Он должен выглядеть следующим образом:

Unsorted:

(1,5)
(2,8)
(6,8)
(1,4)
(2,4)

Сортировка:

(1,4)
(1,5)
(2,4)
(2,8)
(6,8)

По этой причине я подумал о реализации общего метода сравнения (public int compareTo(Tuple<A, B> other)) в классе Tuple. Единственная проблема заключается в том, что все объекты, которые вы могли бы параметризовать для класса (например, A = Integer, B = String), должны реализовать метод compareTo, чтобы все это работало.

Есть ли способ гарантировать, что все объекты, которые может хранить Tuple, реализуют интерфейс Comparable?

Или есть ли другие предложения по решению этой проблемы?

Спасибо

Ответ 1

Вы можете использовать рекурсивные ограничения типов (см. также пункт 27 Эффективная Java), чтобы указать, что компоненты кортежа расширяют Comparable, например так:

 public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> {
    A valueA;
    B valueB;

    @Override
    public int compareTo(Tuple<A, B> tuple) {
        // Implement comparison logic
        return 0;
    }
}

Это позволяет вам указать разные типы для компонентов кортежа (Tuple < Integer, String > ).

Ответ 2

Если вы объявите класс как

public class Tuple<A extends Comparable<? super A>,
                   B extends Comparable<? super B>> { ...

то это гарантирует, что и А, и В самосопоставимы. Затем вы можете вызвать compareTo() для любого объекта типа A или B, который у вас есть в классе.

Ответ 3

Это должно сделать трюк. Любой класс, который вы укажете, должен будет расширить Comparable.

public class Tuple<? extends Comparable> {
}