Объяснение обобщенного <T extends Comparable > в коллекции.sort / сопоставимый код?
Я использую сопоставимый интерфейс все время, чтобы обеспечить естественный порядок для моего classа через collection.sort.
В принципе, если у меня есть class человека, я получу его для реализации интерфейса Comparable и обеспечит реализацию compareTo. Однако в определении Collections.sort в javadocs я вижу эту подпись
public static <T extends Comparable> void sort(List list)
Я вообще не понимаю это определение дженериков? Не стоит ли просто говорить
- JAVA - Лучший подход к анализу огромного (особо большого) файла JSON
- Как читать файл из файла jar?
- доступ к переменной из другого classа
- Преобразование массива объектов в массив их примитивных типов
- Подключение к Db умирает после> 4 <24 в спящем режиме java
<T implements Comparable>
Может кто-то помочь мне с этим?
- Java - почему нет перегрузки метода на основе возвращаемого типа?
- Java Try Catch Наконец блоки без Catch
- Java SecurityException: информация подписчика не соответствует
- Java, перемещение элементов в массиве
- Как слить ячейку в DefaultTableModel / JTable?
- Печать коллекций Java Nicely (toString не возвращает довольно вывод)
- Как установить приоритетный приемник мыши
- Что заставляет JNI звонить медленно?
На самом деле, это означает, что T может реализовать Comparable super T>
Comparable super T>
, а не только 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 super T>
Comparable super T>
более очевидна в перегруженной версии Collections.sort (), которая принимает Comparator super T>
Comparator super T>
:
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 .