Почему для reified не работает стирание типов

Ответ

Reified позволяет сохранить информацию о типе во время выполнения, избегая стирания, благодаря inline-функциям. При компиляции код inline-функции подставляется на место вызова, и тип становится известен статически.

Пример:

inline fun <reified T> checkType(value: Any) {
    if (value is T) println("Correct type")
    else println("Wrong type")
}

checkType<String>("test") // Выведет: Correct type

Без reified проверка value is T невозможна из-за стирания типа T в runtime. Inline-функции позволяют "подставить" реальный тип (String в примере) прямо в месте вызова, сохраняя его информацию.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши реифаиды, ебать мои старые костыли! Слушай, объясню на пальцах, без этой вашей заумщины.

Представь себе, что дженерик-тип — это такой пидарас шерстяной, который на вечеринке появляется в маске. В рантайме маску не снять, нихуя не понятно, кто там. А ты такой: «эй, ты точно String?» А он тебе молчит, потому что маска, ёпта. И компилятор тебе сразу: «чё ты делаешь, дурак? Ты ж его в лицо не видишь!».

И вот тут на сцену выходит наш герой — reified. Это как будто ты пришёл на ту же вечеринку, но уже с рентген-очками. Ты смотришь на этого типа в маске и такой: «ага, вижу череп, вижу скелет — это точно String!». И проверку value is T спокойно делаешь.

А вся магия в том, что функция-то inline. Это значит, что компилятор не вызывает её как отдельную штуку, а тупо впендюривает её код прямо в то место, где ты её написал. И когда он это делает, он уже точно знает, какой конкретный тип ты туда передал. Получается, что в скомпилированном коде никакого таинственного T уже нет — есть конкретный String, Int или что ты там указал.

Вот смотри на примере, тут всё понятно:

inline fun <reified T> checkType(value: Any) {
    if (value is T) println("Correct type")
    else println("Wrong type")
}

checkType<String>("test") // Выведет: Correct type

Когда компилятор это обработает, он по сути сделает так:

// Условно, вот что происходит на месте вызова:
val value: Any = "test"
if (value is String) println("Correct type") // Тип T стал известен и подставился!
else println("Wrong type")

Вот и весь фокус, ни хуя себе, да? Без reified и inline эта проверка is T просто невозможна, потому что к моменту выполнения программы от типа T остаётся только дырка от бублика, стирание, ёперный театр. А с ними — пожалуйста, работай как с обычным классом, доверия ебать ноль к рантайму, всё решается на этапе компиляции.

Короче, reified — это такой костыль, но костыль гениальный, который позволяет обмануть систему и таки узнать, что скрывается за дженерик-параметром, когда программа уже бежит. Главное помнить — работает только в inline-функциях, иначе хуй с горы, а не решение.