reified — Kotlin tilidagi kalit so'z bo'lib, inline-funksiya ichida generic parametrining turiga ish vaqtida kirish imkonini beradi. Oddiy generics-larda type erasure ishlaydi — tur haqidagi ma'lumot kompilyatsiya bosqichida o'chiriladi, lekin reified uni saqlaydi. Kotlin Documentation, 2025 ma'lumotlariga ko'ra, reified faqat inline-funksiyalar ichida ishlaydi, chunki kompilyator haqiqiy turni almashtiradi joylashtirish bosqichida.
Asosiy fikrlar
reified — inline-funksiyaning generic parametrining modifikatori bo'lib, turni runtime-da real qiladi (reify — “jismlashtirish”). Reified bo'lmasa, generic funksiya ichidagi T turi mavjud emas — kompilyator type erasure qo'llaydi, tur haqidagi barcha ma'lumotni o'chiradi. reified kompilyatorni chaqiruv joyida aniq turni almashtirishga majbur qiladi, uni T::class va is operatori orqali mavjud qiladi.
Kotlin Survey by Kodee (2024) ma'lumotlariga ko'ra, reified type parameters Kotlin-ning eng talab qilinadigan o'nta xususiyatidan biridir — so'rovda qatnashgan dasturchilarning 52% undan foydalanadi, asosan generic-fabrikalar, DI-konteynerlar va serializatorlar yozish uchun. Reified ayniqsa Gson, Moshi va Kotlinx Serialization bilan birgalikda mashhur.
Texnik jihatdan mexanizm sodda: reified parametrli inline-funksiya chaqirilganda, kompilyator argumentning aniq turini (Int, String, User) biladi va uni T o'rniga qo'yadi. Bayt-kodda reified-parametr oddiy Class
Reified-dan runtime-da tur talab qilinadigan generic-funksiyalar yozish uchun foydalaning — namuna yaratish, tur tekshiruvi, refleksiya yoki serializatsiya uchun Class
Type erasure — Java va Kotlin mexanizmi bo'lib, unda generic parametrlari haqidagi ma'lumot kompilyatsiya vaqtida o'chiriladi. Bayt-kodda List
// ❌ Xato: O'chirilgan turning namunasini tekshirib bo'lmaydi
fun <T> checkType(value: Any) {
if (value is T) { // type erasure — T noma'lum
println("Tur mos keladi")
}
}
// ✅ Solution: pass Class as parameter
fun <T> checkTypeWithClass(
value: Any,
clazz: Class<T>
) {
if (clazz.isInstance(value)) {
println("Tur mos keladi")
}
}
Misolda, checkType type erasure sababli kompilyatsiya qilinmaydi — kompilyator T o'rniga qaysi turni qo'yishni bilmaydi. checkTypeWithClass da muammo Class
reified modifikatori inline-funksiyada generic parametridan oldin qo'yiladi. Funksiya albatta inline bo'lishi kerak — kompilyator joylashtirish bosqichida aniq turni almashtirish imkoniyatiga ega bo'lishi kerak.
inline fun <reified T> isA(value: Any): Boolean {
return value is T
}
fun main() {
println(isA<String>("Salom")) // true
println(isA<Int>("Salom")) // false
}
Kompilyatsiya vaqtida isA
Agar isA
Reified ning eng keng tarqalgan qo'llanilishi — is operatori orqali tur tekshiruvi. Oddiy generic funksiyada value is T kompilyatsiya qilinmaydi. Reified bilan bu oddiy sinf kabi ishlaydi: 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]
Kengaytma funksiyasi filterByType ro'yxatni filtrlaydi, faqat ko'rsatilgan turdagi elementlarni qoldiradi. Reified bo'lmasa, filterByType
Ma'lumotlarga ko'ra Kotlin Coroutines Guide (JetBrains, 2025), reified tur tekshiruvlari launch va async da korutin natijasining turini uzatish uchun ishlatiladi, bu esa ko'p hollarda turni aniq ko'rsatishdan qochish imkonini beradi.
reified T::class ga — KClass ga havolaga kirish imkonini beradi, undan .java orqali Java Class olish mumkin. Bu refleksiya orqali namuna yaratish, serializatorlar bilan ishlash va ish vaqtida sinf annotatsiyalarini olish imkoniyatlarini ochadi.
inline fun <reified T> createInstance(): T =
T::class.java.getDeclaredConstructor().newInstance()
// Foydalanish
data class User(val name: String = "default")
val user = createInstance<User>()
// Gson bilan serializatsiya
inline fun <reified T> Gson.fromJson(json: String): T =
this.fromJson(json, T::class.java)
// Annotatsiyalarni olish
inline fun <reified T> hasAnnotation<A>(): Boolean where A : Annotation =
T::class.java.isAnnotationPresent(A::class.java)
Gson uchun fromJson o'rami — ishlab chiqarishda reified dan foydalanishning klassik namunasi. gson.fromJson(json, User::class.java) o'rniga gson.fromJson
Reified cheklovlarga ega. Birinchisi — faqat inline-funksiyalar ichida ishlaydi. Agar funksiyani inline qilish mumkin bo'lmasa (masalan, rekursiv yoki juda katta), reified mavjud emas. Ikkinchisi — reified to'g'ridan-to'g'ri suspend-funksiyalar bilan ishlatilmaydi, faqat inline o'ramlar orqali.
Uchinchisi — reified parametrlashgan turlar bilan to'liq ishlamaydi. Masalan, filterByType>() kutilmagan natija berishi mumkin, chunki parametrlashgan turlar uchun reified faqat xom turni (List) saqlaydi, generic argumentlarni ko'rsatmasdan. Parametrlashgan turlarni to'liq tekshirish uchun TypeToken bilan refleksiya talab qilinadi.
| Operatsiya | Reified bilan | Reified bo'lmasa |
|---|---|---|
| value is T | ✅ Ishlaydi | ❌ Kompilyatsiya xatosi |
| T::class | ✅ Ishlaydi | ❌ Kompilyatsiya xatosi |
| List | ⚠️ Faqat raw type | ❌ Xato |
| Namuna yaratish | ✅ Refleksiya orqali | ❌ Class |
| Suspend-funksiya | ❌ Faqat inline o'ram orqali | ❌ Qo'llanilmaydi |
Reified mavjud bo'lmagan hollarda Class
Tez-tez beriladigan savollar
Kompilyator reified parametr T ni funksiya tanasini joylashtirish vaqtida aniq tur bilan almashtiradi. Agar funksiya inline bo'lmasa, kompilyator turni almashtirish uchun joyga ega emas — generic-funksiya chaqiruvi yagona bayt-kod orqali amalga oshadi, bu erda T o'chirilgan. Inline har bir tur-argument uchun alohida bayt-kod nusxasini yaratadi.
Yo'q, reified faqat funksiyalar parametrlariga qo'llaniladi. Xususiyatlar uchun inline fun
reified nullable turlarni qo'llab-quvvatlaydi: reified T : Any (non-null) va oddiy reified T (nullable bo'lishi mumkin). Nullable turlar uchun T::class non-null versiyasi uchun sinfni qaytaradi (String? uchun String::class). value is T tekshiruvi null ni hisobga oladi: agar T = String? bo'lsa, u holda null is T = true.
Minimal. reified refleksiyadan foydalanmaydi — kompilyator aniq turni joylashtirish bosqichida almashtiradi. Bayt-kodda bu sinfga to'g'ridan-to'g'ri havola (ldc + checkcast/invokevirtual). Class
Ha, reified Android-da faol qo'llaniladi. Bundle.getParcelable
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.