Объяснение обобщенного <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 .

  • Что означает знак вопроса в параметре типа generics Java?
  • Gson: Непосредственно конвертировать String в JsonObject (без POJO)
  • java скачать несколько файлов с помощью streamов
  • с открытым исходным кодом обработка изображений в java
  • Проходит ли Java по ссылке?
  • Пакет Java не содержит ошибки
  • Mockito - разница между doReturn () и когда ()
  • Вывод типа отражения на Java 8 Lambdas
  • Итерирует ли ConcurrentHashMap значение streamобезопасности?
  • DBpedia Jena Query возвращает null
  • Как создать службу Windows из приложения java
  • Давайте будем гением компьютера.