Sobes.tech
Middle

Kotlin-də ümumi tiplərlə necə işləmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də ümumi tiplər müxtəlif tiplərdəki məlumatlarla işləyən siniflər, interfeyslər və funksiyalar yaratmağa imkan verir və tiplərin təhlükəsizliyini tərtib zamanı saxlayır.

Əsas anlayışlar və işləmə üsulları:

  • Ümumi sinif və interfeyslərin elan edilməsi:
    class Box<T>(val item: T) // T parametrli ümumi sinif
    interface MyList<E> { // E parametrli ümumi interfeys
        fun add(element: E)
        fun get(index: Int): E
    }
    
  • Ümumi funksiyaların elan edilməsi:
    fun <T> printAnything(value: T) { // T parametrli ümumi funksiya
        println(value)
    }
    
  • Ümumi tiplərin nümunələrinin yaradılması:
    val intBox: Box<Int> = Box(123) // Konkret tipin göstərilməsi (Int)
    val stringBox = Box("hello") // Kompilyator tipini çıxarır (String)
    
  • Variantlar: Bu, ümumi tiplərlə alt tiplərin necə işlədiyini müəyyən etməyə imkan verir.
    • Kovariatsiya (out): Tip və onun alt tiplərindən istifadə etməyə imkan verir. out ilə göstərilir. Məsələn: List<out Any> List<String>-i daxil edə bilər. Qiymət çıxaran tiplər üçün istifadə olunur (məsələn, kolleksiyadan oxumaq).
      interface Producer<out T> { // out T - kovariant parametr
           fun produce(): T
      }
      
    • Kontravariatsiya (in): Tip və onun super tiplərindən istifadə etməyə imkan verir. in ilə göstərilir. Məsələn: Comparator<in String> Comparator<Any> ilə işləyə bilər. Qiymət istehlak edən tiplər üçün istifadə olunur (məsələn, kolleksiyaya yazmaq).
      interface Consumer<in T> { // in T - kontravariant parametr
          fun consume(value: T)
      }
      
    • Invarianlıq: Tip tam olaraq eynidir. Bu, default davranışdır.
  • Tip məhdudiyyətləri (where): Parametr tipini məhdudlaşdırmağa imkan verir ki, o müəyyən interfeysləri həyata keçirsin və ya müəyyən bir sinifdən irs alınsın.
    fun <T : Comparable<T>> max(a: T, b: T): T { // T Comparable-ı həyata keçirməlidir
        return if (a > b) a else b
    }
    
    fun <T> process(item: T) where T : Runnable, T : Comparable<T> {
        item.run()
        // ... müqayisə edilə bilənlikdən istifadə
    }
    
  • Ulduz (star) proyeksiyası (*): Tiplərin konkret arqumentlərinin vacib olmadığı zaman istifadə olunur. Java'dakı <?>-yə bənzəyir.
    fun printList(list: List<*>) { // Hər hansı tiplə siyahı qəbul edə bilər
         for (item in list) {
             println(item)
         }
    }
    

Kotlin-də ümumi tiplər, Java kimi, tip silinməsi (type erasure) istifadə edir. Konkret tiplər haqqında məlumat işləmə zamanı itir. İşləmə zamanı tiplərlə işləmək üçün reified tiplər istifadə olunur.

  • Reified tiplər (reified): Yalnız inline funksiyalar üçün mövcuddur. Parametrin tip məlumatını işləmə zamanı saxlamağa imkan verir.
    inline fun <reified T> checkType(value: Any) { // T - reified tip
        if (value is T) {
            println("Dəyər T tipindədir")
        } else {
            println("Dəyər T tipində deyil")
        }
    }