Как починить filterWrapper, чтобы он фильтровал по T без рефлексии?
Эта функция пытается оставить только элементы типа T, но не компилируется, потому что T стирается в рантайме. Поправьте так, чтобы она работала без передачи аргумента Class и без рефлексии.
fun <T> filterWrapper(data: List<Any>): List<T> =
data.filterIsInstance(T::class.java) // не компилируется: T стирается
Найдите и исправьте ошибку.
Обычный T стирается, поэтому T::class.java недоступен. Сделайте функцию inline, а параметр — reified: inline fun <reified T> filterWrapper(data: List<Any>) = data.filterIsInstance<T>(). Встраивание подставляет реальный тип T в место вызова — без рефлексии.
- ✗Пробовать
T::class.javaв не-inline функции, гдеTстирается - ✗Думать, что спасёт только передача
Class<T>, упускаяreified - ✗Помечать параметр
reifiedбезinlineу функции
- →Почему
reified-параметр обязан быть уinline-функции? - →Какую runtime-проверку выполняет
filterIsInstance<T>()для каждого элемента?
Баг
Параметр типа T стирается на JVM, поэтому внутри обычной функции нет токена T::class.java. Код не компилируется.
fun <T> filterWrapper(data: List<Any>): List<T> =
data.filterIsInstance(T::class.java) // ❌ T стёрт
Исправление
Сделайте функцию inline, а параметр — reified. При встраивании компилятор подставляет конкретный тип T прямо в место вызова, поэтому тип доступен в рантайме без рефлексии.
inline fun <reified T> filterWrapper(data: List<Any>): List<T> =
data.filterIsInstance<T>() // ✅ T известен
reified работает только с inline: без встраивания подставлять реальный тип некуда. filterIsInstance<T>() проверяет каждый элемент через is T.