Объяснение обобщенного <T extends Comparable > в коллекции.sort / сопоставимый код?
Я использую сопоставимый интерфейс все время, чтобы обеспечить естественный порядок для моего classа через collection.sort.
В принципе, если у меня есть class человека, я получу его для реализации интерфейса Comparable и обеспечит реализацию compareTo. Однако в определении Collections.sort в javadocs я вижу эту подпись
public static <T extends Comparable> void sort(List list)
Я вообще не понимаю это определение дженериков? Не стоит ли просто говорить
- Измените параметр строки annotations определения classа во время выполнения
- По умолчанию пространство имен XML, JDOM и XPath
- Как java вычисляет модуль с отрицательными числами?
- Как заполнить HashMap из файла свойств java с помощью Spring @Value
- Темабезопасный одноэлементный class
<T implements Comparable>
Может кто-то помочь мне с этим?
- Как вызвать setUndecorated () после того, как кадр становится видимым?
- Круглые два-два десятичных знака
- Как получить и установить глобальный объект в контексте сервлета Java
- Включить ведение журнала Hibernate
- Утверждение о списке в Junit
- Каков часовой пояс по умолчанию в java.util.Date
- масштабирование с использованием мыши и графики
- Что делать с com.apple.quarantine?
На самом деле, это означает, что 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 .