reified — Kotlin dilində açar sözdür ki, inline-funksiya daxilində generic parametrinin tipinə icra zamanı giriş əldə etməyə imkan verir. Adi generics-də type erasure işləyir — tip haqqında məlumat kompilyasiya mərhələsində silinir, lakin reified onu qoruyur. Kotlin Documentation, 2025-ə görə, reified yalnız inline-funksiyalar daxilində işləyir, çünki kompilyator real tipi əvəz edir yerləşdirmə mərhələsində.
Əsas məqamlar
reified — inline-funksiyanın generic parametrinin modifikatorudur ki, tipi runtime-da real edir (reify — “cisimləşdirmək”). Reified olmadan T tipi generic-funksiya daxilində əlçatan deyil — kompilyator type erasure tətbiq edir, tip haqqında bütün məlumatı silir. reified kompilyatoru çağırış yerində konkret tipi əvəz etməyə məcbur edir, onu T::class və is operatoru vasitəsilə əlçatan edir.
Kotlin Survey by Kodee (2024) məlumatlarına görə, reified type parameters Kotlin-in ən çox tələb olunan on xüsusiyyətindən biridir — onu sorğuda iştirak edən tərtibatçıların 52%-i istifadə edir, əsasən generic-fabrik, DI-konteyner və serializatorlar yazmaq üçün. Reified xüsusilə Gson, Moshi və Kotlinx Serialization ilə birlikdə populyardır.
Texniki olaraq mexanizm sadədir: reified parametrli inline-funksiya çağırıldıqda kompilyator arqumentin konkret tipini (Int, String, User) bilir və onu T əvəzinə qoyur. Bayt-kodda reified-parametr adi Class
Reified-dən runtime-da tip tələb olunan generic-funksiyalar yazmaq üçün istifadə edin — nümunə yaratma, tip yoxlaması, refleksiya və ya serializasiya üçün Class
Type erasure — Java və Kotlin mexanizmidir ki, generic parametrləri haqqında məlumat kompilyasiya zamanı silinir. Bayt-kodda List
// ❌ Xəta: Silinmiş tipin nümunəsini yoxlamaq mümkün deyil
fun <T> checkType(value: Any) {
if (value is T) { // type erasure — T naməlumdur
println("Tip uyğun gəlir")
}
}
// ✅ Solution: pass Class as parameter
fun <T> checkTypeWithClass(
value: Any,
clazz: Class<T>
) {
if (clazz.isInstance(value)) {
println("Tip uyğun gəlir")
}
}
Nümunədə checkType type erasure səbəbindən kompilyasiya olunmur — kompilyator T əvəzinə hansı tipi qoyacağını bilmir. checkTypeWithClass-da problem Class
reified modifikatoru inline-funksiyada generic parametrindən əvvəl qoyulur. Funksiya mütləq inline olmalıdır — kompilyator yerləşdirmə mərhələsində konkret tipi əvəz etmək imkanına malik olmalıdır.
inline fun <reified T> isA(value: Any): Boolean {
return value is T
}
fun main() {
println(isA<String>("Salam")) // true
println(isA<Int>("Salam")) // false
}
Kompilyasiya zamanı isA
isA
Reified-in ən geniş yayılmış tətbiqi — is operatoru vasitəsilə tip yoxlaması. Adi generic-funksiyada value is T kompilyasiya olunmur. Reified ilə bu adi sinif kimi işləyir: 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]
Genişləndirmə funksiyası filterByType siyahını filtr edir, yalnız göstərilən tipin elementlərini saxlayır. Reified olmadan filterByType
Məlumatlara görə Kotlin Coroutines Guide (JetBrains, 2025), reified type checks launch və async-də korutinin nəticə tipini ötürmək üçün istifadə olunur ki, bu da əksər hallarda tipin açıq göstərilməsindən qaçmağa imkan verir.
reified T::class-a — KClass istinadına giriş verir, ondan .java vasitəsilə Java Class əldə etmək olar. Bu, refleksiya vasitəsilə nümunə yaratma, serializatorlarla iş və icra zamanı sinif annotasiyalarını əldə etmək imkanları açır.
inline fun <reified T> createInstance(): T =
T::class.java.getDeclaredConstructor().newInstance()
// İstifadə
data class User(val name: String = "default")
val user = createInstance<User>()
// Gson ilə serializasiya
inline fun <reified T> Gson.fromJson(json: String): T =
this.fromJson(json, T::class.java)
// Annotasiyaların alınması
inline fun <reified T> hasAnnotation<A>(): Boolean where A : Annotation =
T::class.java.isAnnotationPresent(A::class.java)
Gson üçün fromJson sarğısı — istehsalatda reified istifadəsinin klassik nümunəsidir. gson.fromJson(json, User::class.java) əvəzinə gson.fromJson
Reified-in məhdudiyyətləri var. Birincisi — yalnız inline-funksiyalar daxilində işləyir. Funksiyanı inline etmək mümkün deyilsə (məsələn, rekursivdirsə və ya çox böyükdürsə), reified əlçatan deyil. İkincisi — reified birbaşa suspend-funksiyalarla istifadə edilə bilməz, yalnız inline sarğılar vasitəsilə.
Üçüncüsü — reified parametrləşdirilmiş tiplərlə tam işləmir. Məsələn, filterByType>() gözlənilməz nəticə verə bilər, çünki parametrləşdirilmiş tiplər üçün reified yalnız xam tipi (List) saxlayır, generic arqumentləri göstərmədən. Parametrləşdirilmiş tiplərin tam yoxlanması üçün TypeToken ilə refleksiya tələb olunur.
| Əməliyyat | Reified ilə | Reified olmadan |
|---|---|---|
| value is T | ✅ İşləyir | ❌ Kompilyasiya xətası |
| T::class | ✅ İşləyir | ❌ Kompilyasiya xətası |
| List | ⚠️ Yalnız raw type | ❌ Xəta |
| Nümunə yaratma | ✅ Refleksiya vasitəsilə | ❌ Class |
| Suspend-funksiya | ❌ Yalnız inline sarğı vasitəsilə | ❌ Tətbiq edilmir |
Reified-in əlçatan olmadığı hallarda Class
Tez-tez verilən suallar
Kompilyator reified-parametr T-ni funksiyanın gövdəsinin yerləşdirilməsi zamanı konkret tiplə əvəz edir. Funksiya inline deyilsə, kompilyatorun tipi əvəz etmək üçün yeri yoxdur — generic-funksiyanın çağırışı vahid bayt-kod vasitəsilə baş verir, burada T silinmişdir. Inline hər bir tip-arqument üçün ayrıca bayt-kod nüsxəsi yaradır.
Xeyr, reified yalnız funksiyaların parametrlərinə tətbiq olunur. Xüsusiyyətlər üçün inline fun
reified nullable tipləri dəstəkləyir: reified T : Any (non-null) və sadəcə reified T (nullable ola bilər). Nullable tiplər üçün T::class non-null versiyası üçün sinfi qaytarır (String? üçün String::class). value is T yoxlaması null-u nəzərə alır: əgər T = String?, onda null is T = true.
Minimaldır. reified refleksiyadan istifadə etmir — kompilyator konkret tipi yerləşdirmə mərhələsində əvəz edir. Bayt-kodda bu birbaşa sinfə istinaddır (ldc + checkcast/invokevirtual). Class
Bəli, reified Android-də fəal şəkildə istifadə olunur. Bundle.getParcelable
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun