Зачем в сигнатуре пишут <T extends Comparable<T>>?
Граница сужает допустимые типы и открывает методы границы: без неё T — просто Object, и compareTo вызвать нельзя. После стирания T заменяется верхней границей — Comparable.
- Полная форма: <T extends Comparable<? super T>> — чтобы подошёл и тип, унаследовавший compareTo от родителя
- Несколько границ: <T extends Number & Comparable<T>>, класс — первым
- Пример: Collections.max
А ещё Рекурсивная граница: Enum<E extends Enum<E>>
Подробно
Без границы компилятор считает T обычным Object, и вызвать compareTo нельзя. Указание extends решает обе задачи: проверка на этапе компиляции и доступ к API границы. Есть и техническая деталь: после стирания T заменяется именно на верхнюю границу, поэтому в байткоде параметр становится Comparable, а не Object. Полезно знать и более гибкую форму, которую применяют в стандартной библиотеке: <T extends Comparable<? super T>> — она допускает случай, когда сравнение реализовано в суперклассе, что часто встречается в иерархиях. Границ может быть несколько через амперсанд, причём класс, если он есть, указывается первым.
Что хотят услышать
- Две задачи границы.
- Вариант с ? super T.
Частые ошибки
- Забывать про форму с ? super T и получать неоправданно строгое ограничение.
- Считать, что границы влияют на что-то в рантайме, кроме результата стирания.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Чтобы разрешить передавать любые подтипы Comparable, включая несравнимые
- ✓Чтобы принимать только сравнимые типы и вызывать compareTo внутри метода без приведений
- ✗Чтобы отключить стирание типов для этого параметра
- ✗Чтобы метод стал ковариантным по T
Что спросят дальше
- Зачем в JDK пишут Comparable<? super T>?
- Можно ли указать несколько границ и в каком порядке?
Разбор темы
- Дженерики и стирание типов
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.