Получить доступ

Зачем в сигнатуре пишут <T extends Comparable<T>>?

MiddleДженерики
Коротко

Граница сужает допустимые типы и открывает методы границы: без неё T — просто Object, и compareTo вызвать нельзя. После стирания T заменяется верхней границей — Comparable.

  • Полная форма: <T extends Comparable<? super T>> — чтобы подошёл и тип, унаследовавший compareTo от родителя
  • Несколько границ: <T extends Number & Comparable<T>>, класс — первым
  • Пример: Collections.max

А ещё Рекурсивная граница: Enum<E extends Enum<E>>

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Без границы компилятор считает T обычным Object, и вызвать compareTo нельзя. Указание extends решает обе задачи: проверка на этапе компиляции и доступ к API границы. Есть и техническая деталь: после стирания T заменяется именно на верхнюю границу, поэтому в байткоде параметр становится Comparable, а не Object. Полезно знать и более гибкую форму, которую применяют в стандартной библиотеке: <T extends Comparable<? super T>> — она допускает случай, когда сравнение реализовано в суперклассе, что часто встречается в иерархиях. Границ может быть несколько через амперсанд, причём класс, если он есть, указывается первым.

Что хотят услышать

  • Две задачи границы.
  • Вариант с ? super T.

Частые ошибки

  • Забывать про форму с ? super T и получать неоправданно строгое ограничение.
  • Считать, что границы влияют на что-то в рантайме, кроме результата стирания.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Чтобы ограничить параметр типами, которые можно сравнивать, и получить доступ к compareTo внутри метода
  • ✗Чтобы разрешить передавать в метод любые подтипы Comparable, включая несравнимые между собой
  • ✗Чтобы отключить стирание типов для этого параметра
  • ✗Чтобы метод стал ковариантным по T

Что спросят дальше

  • Зачем в JDK пишут Comparable<? super T>?
  • Можно ли указать несколько границ и в каком порядке?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем