Выбор ответа Middle Дженерики и вариантность спрашивают часто обновлено

Проверка is List<String> и стирание типов

Вопрос

Почему if (x is List<String>) не компилируется при x: Any?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Аргументы дженериков стираются, рантайм их не знает. При компиляции на JVM аргументы дженериков стираются, объект знает только, что он List.

Варианты ответа

  1. is нельзя использовать с интерфейсами, только с классами
  2. Аргументы дженериков стираются, рантайм их не знаетправильный ответ
  3. Нужно писать x instanceof List<String>, как в Java
  4. Дженерики с is работают только с классами из stdlib

Разбор

При компиляции на JVM аргументы дженериков стираются, объект знает только, что он List. Поэтому компилятор запрещает проверку «cannot check for instance of erased type». Можно x is List<*>, а для конкретного типа элементов проверять сами элементы или использовать reified. is с интерфейсами работает, instanceof это синтаксис Java.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.