Выбор ответа 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 запрещены.
Варианты ответа
reifiedпревращаетTвAnyи проверка всегда истинна- Типы стираются, а inline с
reifiedподставляет реальный типправильный ответ - Обычные дженерики Kotlin не поддерживают оператор
is - Во втором случае проверка делается при компиляции, а не в рантайме
Разбор
Из-за стирания типов внутри обычной дженерик-функции T в рантайме неизвестен, поэтому is T и T::class запрещены. Inline-функция копируется в место вызова, где конкретный тип известен, и reified разрешает его использовать: is String, String::class.java. Проверка is всё равно выполняется в рантайме, просто с конкретным типом. is с обычными типами в дженериках работает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.