Ответ
reified позволяет использовать тип T в runtime внутри inline-функции. Обычно дженерики в Kotlin стираются, но с reified тип сохраняется.
Пример:
inline fun <reified T> checkType(item: Any): Boolean {
return item is T
}
val isString = checkType<String>("test") // true
val isInt = checkType<Int>("test") // false
Без reified нельзя проверить item is T — компилятор выдаст ошибку. Ограничение: reified можно использовать только с inline-функциями, так как код подставляется на этапе компиляции.
Ответ 18+ 🔞
А, ну это же про reified! Слушай, история вообще пиздец какая интересная. Вот смотри, обычно в Котлине дженерики — это такая хуйня, которая на этапе компиляции есть, а в рантайме их нихуя нет, стираются, понимаешь? Как будто их и не было. И ты не можешь внутри функции проверить, что за тип T пришёл, потому что к тому моменту компилятор уже всё выкинул, осталась только Any или Object. Полный пиздец, да?
А вот этот reified — это такой волшебный пинок под жопу системе. Он говорит: «Нет, блядь, стой! Не стирай этот тип, я его в рантайме пощупать хочу!». И компилятор, такой: «Ну ладно, ёпта, раз inline-функция...».
Вот смотри на примере, тут всё понятно становится:
inline fun <reified T> checkType(item: Any): Boolean {
return item is T // А вот тут без reified была бы ошибка — типа «не могу я проверить, я ж не знаю, что за T!»
}
val isString = checkType<String>("test") // true — ну тут логично, строка же
val isInt = checkType<Int>("test") // false — потому что строка — это не инт, ёпта
Без этого самого reified ты бы на строке item is T получил бы ошибку компиляции, что-то вроде «Cannot check for instance of erased type: T». Компилятор бы просто охуел от твоей наглости и послал тебя нахуй.
Но есть, конечно, и подвох, ядрёна вошь! Эту магию можно творить только с inline-функциями. Потому что по факту компилятор не вызывает функцию, а тупо вставляет её код в месте вызова, и уже там он знает конкретный тип, который ты указал. Это как будто ты написал item is String прямо в коде. Хитро, да?
Так что запомни: хочешь пощупать тип в рантайме — делай функцию inline и вешай на тип reified. Всё остальное — это пизда рулю и пустая трата времени.