Reified Kotlin-də — bu nədir, sintaksis və tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-06-21 Oxuma vaxtı: 8 dəq

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 — generic parametrinin modifikatoru, tip haqqında məlumatı runtime-da saxlayır
  • Inline only — reified yalnız inline-funksiyalar daxilində işləyir
  • Type erasure — Java/Kotlin-in standart mexanizmi, generic tipləri silir; reified onu yan keçir
  • is yoxlamaları — mümkündür: if (value is T) əvəzinə if (value is String)
  • Nümunə yaratma — Class ötürmədən T::class.java.newInstance() yaratma

Kotlin-də reified nədir?

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-yə çevrilir, gizli arqument kimi ötürülür.

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 əldə etmə.

Generics-də type erasure problemi

Type erasure — Java və Kotlin mexanizmidir ki, generic parametrləri haqqında məlumat kompilyasiya zamanı silinir. Bayt-kodda List və List sadəcə List-ə çevrilir. Bu, generics-in olmadığı Java 1.4 ilə geriyə uyğunluq üçün edilmişdir, lakin runtime-da tiplərlə işləyərkən məhdudiyyətlər yaradır.

kotlin
// ❌ 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-nin açıq ötürülməsi ilə həll edilmişdir, lakin bu boilerplate tələb edir: hər çağırış .java və ya ::class.java ilə müşayiət olunur. reified bu boilerplate-i tamamilə aradan qaldırır.

Reified sintaksisi və iş mexanizmi

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.

kotlin
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("Hello") çağırışı value is String yoxlaması ilə əvəz olunur. isA("Hello") çağırışı — value is Int ilə. Tip hərfi mənada əvəz olunur ki, bu da type erasure-da əlçatan olmayan is, as, ::class və digər əməliyyatları istifadə etməyə imkan verir.

Reified-funksiyanın dekompilyasiyası

isA("Hello") bayt-kodunu dekompilyasiya etsək, IntelliJ IDEA Java-da təxminən belə bir nəticə göstərəcək: String.class.isInstance(value). Generic parametri əvəzinə kompilyator konkret java.lang.String.class qoydu — adla tip axtarışı ilə heç bir refleksiya yoxdur, yalnız birbaşa sinfə istinad.

Reified ilə tip yoxlamaları: is və as

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 (demək olar ki — parametrləşdirilmiş tiplər üçün reified məhdudiyyətləri nəzərə alınmaqla).

kotlin
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(list) Class parametri ilə yazılmalı idi. Reified ilə çağırış siyahı üzərində təbii əməliyyat kimi oxunur ki, bu da məlumat emalı zəncirlərinin oxunaqlılığını yaxşılaşdırır.

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 ilə refleksiya: nümunə yaratma və Class-a giriş

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.

kotlin
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(json) yazmaq olar. Bu kiçik yaxşılaşdırma kimi görünsə də, yüzlərlə serializasiya çağırışı olan layihədə reified boilerplate-i əhəmiyyətli dərəcədə azaldır və kodu təmizləyir.

Reified məhdudiyyətləri və alternativlər

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əliyyatReified iləReified olmadan
value is T✅ İşləyir❌ Kompilyasiya xətası
T::class✅ İşləyir❌ Kompilyasiya xətası
List is T⚠️ Yalnız raw type❌ Xəta
Nümunə yaratma✅ Refleksiya vasitəsilə❌ Class tələb olunur
Suspend-funksiya❌ Yalnız inline sarğı vasitəsilə❌ Tətbiq edilmir

Reified-in əlçatan olmadığı hallarda Class və ya kitabxanalardan TypeToken-un açıq ötürülməsi ilə nümunədən istifadə edin (məsələn, Gson TypeToken və ya Jackson TypeReference). Bu yanaşma istənilən funksiyalarda işləyir, lakin boilerplate tələb edir və daha az rahatdır.

Tez-tez verilən suallar

Niyə reified yalnız inline-funksiyalarla işləyir?

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.

Reified property elan etmək mümkündürmü?

Xeyr, reified yalnız funksiyaların parametrlərinə tətbiq olunur. Xüsusiyyətlər üçün inline fun qaytarış dəyəri ilə nümunəsi və ya Class-nin konstruktor vasitəsilə açıq ötürülməsi istifadə olunur. Genişləndirmə xüsusiyyətləri də reified dəstəkləmir.

Reified nullable tiplərlə necə işləyir?

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.

Reified-in performans yükü varmı?

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-nin əl ilə ötürülməsi ilə müqayisədə yük yoxdur — hər iki variant eyni bayt-kodu yaradır.

Android inkişafında reified istifadə etmək olarmı?

Bəli, reified Android-də fəal şəkildə istifadə olunur. Bundle.getParcelable(), Intent.getSerializableExtra(), viewModels() Android KTX-dən — bütün bu funksiyalar Class-nin açıq ötürülməsindən qaçmaq üçün reified istifadə edir. Məlumatlara görə Google Android Docs (2025), reified runtime-da tip tələb olunan generic API üçün tövsiyə olunur.

Nəticə

  • reified — inline-funksiyanın generic parametrinin modifikatoru, tipi runtime-da saxlayır
  • Type erasure — tipləri silən standart mexanizm; reified yerləşdirmə vasitəsilə onu yan keçir
  • is/as — tip yoxlaması və çevrilmə reified ilə adi siniflər kimi işləyir
  • Sinif istinadı — T::class və T::class.java refleksiya və serializasiya üçün əlçatandır
  • Yalnız inline — reified tip əvəzetmə mexanizminə görə inline-funksiya olmadan mümkün deyil
  • Parametrləşdirilmiş tiplər — reified generic arqumentləri saxlamır (yalnız raw type)
  • Tətbiq — Gson/Moshi serializasiyası, DI-konteynerlər, kolleksiyalarda tip yoxlamaları, Android KTX

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.

Layihəni müzakirə et

Həm də oxuyun