Этот вопрос проверяет понимание реализации обобщённых типов в Kotlin и особенностей их компиляции.
Kotlin-дженерики реализованы через стирание типов (type erasure) на JVM, аналогично Java: информация о конкретном параметре типа недоступна в рантайме. Компилятор проверяет типы во время компиляции, а затем генерирует код без параметризации. Для сохранения информации о типе используют реифицированные (reified) параметры в inline-функциях.
Type Erasure:
Параметры типа удаляются в байткоде, остаётся Object или верхняя граница.
Ограничивает проверки типа в рантайме.
Компиляция:
Компилятор вставляет приведения типов (cast) там, где нужно.
Неявная безопасность гарантируется на этапе компиляции.
Работа с отражением:
Нельзя получить KClass<T> для общего типа без реификации.
Реификация через inline:
inline fun <reified T> Gson.fromJson(json: String): T — компилятор инлайнит и сохраняет T::class.
Пример:
fun <T> List<Any>.firstAs(): T {
return this.first() as T
}
inline fun <reified T> Gson.fromJson(json: String): T {
return this.fromJson(json, T::class.java)
}Когда обращать внимание:
При работе с сериализацией/десериализацией.
При необходимости проверять тип параметра в рантайме.