Вопрос с собеседования · Java

Почему 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 позволяют объявлять вариантность в месте объявления

Подробно

Если бы присваивание разрешалось, через новую ссылку можно было бы добавить 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

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования