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

Почему List<String> нельзя присвоить переменной типа List<Object>?

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

Дженерики инвариантны: если бы List<Object> objs = strings компилировалось, через objs можно было бы положить Integer, а потом получить ClassCastException при чтении из списка строк — в совсем другом месте.

  • Массивы ковариантны: Object[] arr = new String[1] компилируется, а запись Integer даёт ArrayStoreException
  • Нужна гибкость — List<? extends Object> (только чтение) или List<?>
  • Инвариантность переносит ошибку из рантайма в компиляцию

А ещё Kotlin и Scala позволяют объявлять вариантность в месте объявления

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

Подробно

Если бы присваивание разрешалось, через новую ссылку можно было бы добавить Integer, а потом получить ClassCastException при чтении из исходного List<String> — причём в совсем другом месте программы. Поучительно сравнить с массивами: они как раз ковариантны, поэтому Object[] arr = new String[1] компилируется, а запись Integer в него падает уже в рантайме с ArrayStoreException. Дженерики сознательно строже, чтобы ошибка ловилась компилятором. Когда гибкость всё же нужна, её добавляют wildcard: List<? extends Object> для чтения, List<? super String> для записи.

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

  • Почему запрещено, с примером.
  • Сравнение с массивами.

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

  • Ожидать от дженериков ковариантности по аналогии с массивами.
  • Считать причиной стирание типов — дело в правилах типизации.

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

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

Показать варианты и ответ
  • ✓Дженерики инвариантны: иначе через ссылку List<Object> можно было бы положить Integer в список строк
  • ✗Из-за стирания типов такое присваивание технически невозможно
  • ✗Можно, компилятор разрешает это без предупреждений
  • ✗Потому что String является финальным классом

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

  • Почему массивы в Java ковариантны и чем это опасно?
  • Что такое PECS?

Разбор темы

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

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

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

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

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