Выбор ответа Middle Лямбды, inline и reified спрашивают часто обновлено

reified и стирание типов

Вопрос

Почему fun <T> check(x: Any) = x is T не компилируется, а inline fun <reified T> check(x: Any) = x is T компилируется?

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

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

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

Коротко

Правильный ответ: Типы стираются, а inline с reified подставляет реальный тип. Из-за стирания типов внутри обычной дженерик-функции T в рантайме неизвестен, поэтому is T и T::class запрещены.

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

  1. reified превращает T в Any и проверка всегда истинна
  2. Типы стираются, а inline с reified подставляет реальный типправильный ответ
  3. Обычные дженерики Kotlin не поддерживают оператор is
  4. Во втором случае проверка делается при компиляции, а не в рантайме

Разбор

Из-за стирания типов внутри обычной дженерик-функции T в рантайме неизвестен, поэтому is T и T::class запрещены. Inline-функция копируется в место вызова, где конкретный тип известен, и reified разрешает его использовать: is String, String::class.java. Проверка is всё равно выполняется в рантайме, просто с конкретным типом. is с обычными типами в дженериках работает.

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

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