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

Что дают дженерики при работе с коллекциями?

JuniorДженерики
Ещё спрашивают так:
  • Зачем нужны дженерики?
  • Что такое raw type?
Коротко

Дженерики переносят проверку типов на этап компиляции и убирают ручные приведения при чтении.

  • Без них коллекция хранит Object: ClassCastException всплывает в рантайме, далеко от места ошибки
  • Сырые типы (List без параметра) — наследие, компилятор предупреждает

А ещё В рантайме параметр стёрт: тип элементов неизвестен, примитивы не поддерживаются

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

Подробно

До Java 5 коллекции хранили Object. Положить туда можно было что угодно, а при чтении требовалось приведение (String) list.get(0). Если кто-то положил число, ошибка ClassCastException вылетала при чтении — часто совсем в другом месте программы.

С дженериками List<String>:

  • компилятор не даст положить не строку;
  • при чтении приведение не нужно — тип известен;
  • код сам себя документирует: видно, что лежит в коллекции.

Дженерики используют не только в коллекциях: Optional<T>, Comparator<T>, собственные обобщённые классы и методы (<T> T first(List<T> list)).

Сырые типы — List без параметра — оставлены для совместимости со старым кодом. Их использование отключает проверки, компилятор предупреждает.

Ограничение: параметр типа стирается при компиляции, поэтому в рантайме тип элементов недоступен, а примитивы как параметр не поддерживаются.

Пример

List raw = new ArrayList();      // сырой тип
raw.add(42);
String s = (String) raw.get(0);  // ClassCastException во время выполнения

List<String> names = new ArrayList<>();
// names.add(42);                // ошибка компиляции
String first = names.get(0);     // без приведения

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

  • Проверка типов при компиляции вместо ошибок в рантайме.
  • Отсутствие приведений при чтении.
  • Сырые типы и их опасность.
  • Ограничения из-за стирания — плюс.

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

  • Ожидать выигрыша в производительности от параметризации.
  • Рассчитывать узнать параметр типа во время выполнения.

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

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

Показать варианты и ответ
  • ✓Проверку типов на этапе компиляции и отсутствие приведений при чтении элементов
  • ✗Ускорение работы коллекции за счёт специализации кода
  • ✗Возможность хранить примитивные типы без упаковки
  • ✗Автоматическую синхронизацию доступа к элементам

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

  • Что такое стирание типов и к чему оно приводит?
  • Почему нельзя написать List<int>?

Разбор темы

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

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

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

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

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