reified — кључна реч у језику Kotlin која омогућава приступ типу generic параметра унутар inline функције током извршавања. Код обичних generics-а делује type erasure — информација о типу се брише у фази компилације, али reified је чува. Према Kotlin Documentation, 2025, reified ради само унутар inline функција, јер компајлер замењује стварни тип у фази уграђивања.
Главне тачке
reified — модификатор generic параметра inline функције који чини тип стварним (reify — “овештаствља”) у runtime-у. Без reified-а тип T унутар generic функције је недоступан — компајлер примењује type erasure, бришући све информације о типу. reified приморава компајлер да замени конкретни тип на месту позива, чинећи га доступним кроз T::class и оператор is.
Према Kotlin Survey by Kodee (2024), reified type parameters се налазе међу десет најтраженијих Kotlin функција — користи их 52% анкетираних програмера, углавном за писање generic фабрика, DI контејнера и серијализатора. Посебно је популаран reified у комбинацији са Gson, Moshi и Kotlinx Serialization.
Технички, механизам је једноставан: при позивању inline функције са reified параметром, компајлер зна конкретни тип аргумента (Int, String, User) и замењује га уместо T. У бајт-коду, reified параметар се претвара у обичан Class
Користите reified за писање generic функција где је потребан тип у runtime-у — креирање инстанци, провере типа, добијање Class
Type erasure — механизам Java и Kotlin-а код кога се информација о generic параметрима брише током компилације. У бајт-коду, List
// ❌ Грешка: Није могуће проверити инстанцу избрисаног типа
fun <T> checkType(value: Any) {
if (value is T) { // type erasure — T је непознат
println("Тип се поклапа")
}
}
// ✅ Solution: pass Class as parameter
fun <T> checkTypeWithClass(
value: Any,
clazz: Class<T>
) {
if (clazz.isInstance(value)) {
println("Тип се поклапа")
}
}
У примеру, checkType се не компајлира због type erasure — компајлер не зна који тип да замени уместо T. У checkTypeWithClass проблем је решен експлицитним прослеђивањем Class
Модификатор reified се поставља испред generic параметра у inline функцији. Функција мора обавезно бити inline — компајлер мора имати могућност замене конкретног типа у фази уграђивања.
inline fun <reified T> isA(value: Any): Boolean {
return value is T
}
fun main() {
println(isA<String>("Здраво")) // true
println(isA<Int>("Здраво")) // false
}
Током компилације, позив isA
Ако декомпајлирамо бајт-код isA
Најчешћа примена reified-а — провера типа кроз оператор is. У обичној generic функцији value is T се не компајлира. Са reified-ом ово ради као са обичном класом: value is String, value is List
inline fun <reified T> List<Any>.filterByType(): List<T> {
return this.filter { it is T }.map { it as T }
}
val mixed = listOf("a", 1, "b", 2)
val strings = mixed.filterByType<String>() // ["a", "b"]
val ints = mixed.filterByType<Int>() // [1, 2]
Екстензиона функција filterByType филтрира листу, остављајући само елементе наведеног типа. Без reified-а морало би да се пише filterByType
Према подацима Kotlin Coroutines Guide (JetBrains, 2025), reified провере типа се користе у launch и async за пренос типа резултата корутине, што омогућава избегавање експлицитног навођења типа у већини случајева.
reified даје приступ T::class — референци на KClass, из које се може добити Java Class преко .java. Ово отвара могућности за креирање инстанци кроз рефлексију, рад са серијализаторима и добијање анотација класе током извршавања.
inline fun <reified T> createInstance(): T =
T::class.java.getDeclaredConstructor().newInstance()
// Употреба
data class User(val name: String = "default")
val user = createInstance<User>()
// Серијализација са Gson
inline fun <reified T> Gson.fromJson(json: String): T =
this.fromJson(json, T::class.java)
// Добијање анотација
inline fun <reified T> hasAnnotation<A>(): Boolean where A : Annotation =
T::class.java.isAnnotationPresent(A::class.java)
Омотач fromJson за Gson — класичан пример коришћења reified у продукцији. Уместо gson.fromJson(json, User::class.java) може се писати gson.fromJson
reified има ограничења. Прво — ради само унутар inline функција. Ако функција не може да буде inline (на пример, рекурзивна је или превелика), reified није доступан. Друго — reified се не може користити директно са suspend функцијама, само кроз inline омотаче.
Треће — reified не ради у потпуности са параметризованим типовима. На пример, filterByType>() може дати неочекивани резултат, јер за параметризоване типове reified чува само сирови тип (List), без навођења generic аргумената. За потпуну проверу параметризованих типова потребна је рефлексија са TypeToken-ом.
| Операција | Са reified | Без reified |
|---|---|---|
| value is T | ✅ Ради | ❌ Грешка компилације |
| T::class | ✅ Ради | ❌ Грешка компилације |
| List | ⚠️ Само raw type | ❌ Грешка |
| Креирање инстанце | ✅ Кроз рефлексију | ❌ Потребан Class |
| Suspend функција | ❌ Само кроз inline омотач | ❌ Није применљиво |
За случајеве када reified није доступан, користите образац са експлицитним прослеђивањем Class
Често постављана питања
Компајлер замењује reified параметар T конкретним типом током уграђивања тела функције. Ако функција није inline, компајлер нема место где да замени тип — позив generic функције се одвија кроз јединствени бајт-код, где је T избрисан. Inline ствара посебну копију бајт-кода за сваки тип-аргумент.
Не, reified се примењује само на параметре функција. За својства се користи образац inline fun
reified подржава nullable типове: reified T : Any (non-null) и просто reified T (може бити nullable). За nullable типове, T::class враћа класу за non-null верзију (String::class за String?). Провера value is T узима у обзир null: ако T = String?, онда null is T = true.
Минималан. reified не користи рефлексију — компајлер замењује конкретни тип у фази уграђивања. У бајт-коду ово је директна референца на класу (ldc + checkcast/invokevirtual). Нема overhead-а у поређењу са ручним прослеђивањем Class
Да, reified се активно користи у Android-у. Bundle.getParcelable
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође