Почему List<String> нельзя присвоить переменной типа List<Object>?
Дженерики инвариантны: если бы 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?
Разбор темы
- Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.