Объяснение обобщенного <T extends Comparable > в коллекции.sort / сопоставимый код?

Я использую сопоставимый интерфейс все время, чтобы обеспечить естественный порядок для моего classа через collection.sort.

В принципе, если у меня есть class человека, я получу его для реализации интерфейса Comparable и обеспечит реализацию compareTo. Однако в определении Collections.sort в javadocs я вижу эту подпись

public static <T extends Comparable> void sort(List list) 

Я вообще не понимаю это определение дженериков? Не стоит ли просто говорить

 <T implements Comparable> 

Может кто-то помочь мне с этим?

На самом деле, это означает, что T может реализовать Comparable Comparable , а не только Comparable .

Например, это означает, что class Student может реализовать Comparable , где Student является подclassом Person :

 public class Person {} public class Student extends Person implements Comparable { @Override public int compareTo(Person that) { // ... } } 

В этом случае список может быть отсортирован по Collections.sort() но только на основе свойств Person , потому что вы передаете экземпляр Student в compareTo() как Person (если вы, конечно, не упустите его).

На практике, однако, вы никогда не увидите, как class Student реализует Comparable . Это потому, что Person , вероятно, выполнил Comparable , а Student наследует его реализацию. Конечный результат один и тот же: вы можете передать List в Collections.sort() и отсортировать его по свойствам Person .

Разница между Comparable и Comparable Comparable более очевидна в перегруженной версии Collections.sort (), которая принимает Comparator Comparator :

 class ByAgeAscending implements Comparator { @Override public int compare(Person a, Person b) { return a.getAge() < b.getAge(); } } List students = getSomeStudents(); Collections.sort(students, new ByAgeAscending()); 

Вы всегда используете расширения с универсальными подстановочными знаками, даже если параметр type реализует интерфейс.

Если вы посмотрите на class, реализующий Comparable , вы увидите, что он должен (должен) реализовать Comparable , где T – сам class.

Это имеет смысл, если вы думаете о параметре типа, который передается интерфейсу Comparable и как он используется в методе compareTo () .

Как красноречиво указывает PM 77-1, ключевое слово super позволяет либо classу, либо T, либо одному из его родителей реализовать Comparable .

  • Что такое идиома C ++, эквивалентная статическому блоку Java?
  • Переопределение переменных экземпляра суперclassа
  • Чтение файла XLSX в Java
  • Полезные шаблоны кода Java Eclipse
  • Как установить разделитель тысяч в Java?
  • Как программно изменить права доступа к файлам?
  • Зарезервированное ключевое слово Gson Java
  • Java, как рисовать постоянно меняющуюся графику
  • Сериализация jacksonа JSON, предотrotation рекурсии путем определения уровня
  • Статический инициализатор в Java
  • Прогресс Bar Java
  • Давайте будем гением компьютера.