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

Чем опасно использование raw type, например List вместо List<String>?

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

Raw type выключает проверку дженериков для всего выражения: в список строк можно положить число, а ClassCastException появится далеко — при чтении, где компилятор вставил приведение.

  • Компилятор лишь предупреждает: unchecked
  • Существуют только для совместимости со старым кодом
  • Вместо raw — List<?> (безопасно читать) или List<Object>

А ещё Raw-ссылка стирает дженерики даже в несвязанных методах класса

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

Подробно

Особенно коварно то, что отключается не только проверка конкретного параметра: при работе через raw-ссылку компилятор перестаёт применять дженерик-правила ко всему объявлению, включая параметры, к которым претензий не было. Ошибка проявится потом — при чтении из коллекции, где вставленное приведение бросит ClassCastException, и стектрейс укажет на место чтения, а не на место неправильной записи. Raw types существуют исключительно ради совместимости с кодом, написанным до Java 5, и в новом коде им места нет. Если параметр действительно неважен, правильная форма — безграничный wildcard List<?>: он сохраняет проверки типов, запрещая небезопасное добавление.

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

  • Почему опасно.
  • Альтернативы.

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

  • Использовать raw type, чтобы «убрать предупреждение компилятора».
  • Путать List и List<?> — второе типобезопасно.

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

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

Показать варианты и ответ
  • ✓Компилятор отключает проверку дженериков для всего выражения — ошибки типов уходят в рантайм в виде ClassCastException в неожиданных местах
  • ✗Raw type работает медленнее параметризованного
  • ✗Raw type запрещён и не компилируется начиная с Java 8
  • ✗Raw type занимает больше памяти

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

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

Разбор темы

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

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

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

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

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