Sobes.tech
Middle

Kotlin'da generik tiplari bilan qanday ishlash mumkin?

sobes.tech AI

AIdan javob

Kotlin'dagi umumiy turlar turli tiplardagi ma'lumotlar bilan ishlaydigan sinflar, interfeyslar va funksiyalarni yaratishga imkon beradi, shuningdek, kompilatsiya vaqtida tur xavfsizligini saqlaydi.

Asosiy tushunchalar va ishlash usullari:

  • Umumiy sinflar va interfeyslarni e'lon qilish:
    class Box<T>(val item: T) // T parametrli umumiy sinf
    interface MyList<E> { // E parametrli umumiy interfeys
        fun add(element: E)
        fun get(index: Int): E
    }
    
  • Umumiy funksiyalarni e'lon qilish:
    fun <T> printAnything(value: T) { // T parametrli umumiy funksiya
        println(value)
    }
    
  • Umumiy turlar nusxalarini yaratish:
    val intBox: Box<Int> = Box(123) // Aniq tur (Int) ko'rsatilgan
    val stringBox = Box("hello") // Kompilyator turini aniqlaydi (String)
    
  • Variantlar: Umumiy turlar bilan subtiplarning qanday ishlashini belgilash imkonini beradi.
    • Kovariatsiya (out): Tur va uning subtiplarini ishlatishga imkon beradi. out bilan belgilangan. Misol uchun: List<out Any> List<String> ni o'z ichiga olishi mumkin. Qiymat chiqaradigan turlar uchun ishlatiladi (masalan, kolleksiyalardan o'qish).
      interface Producer<out T> { // out T - kovariatsiya parametri
           fun produce(): T
      }
      
    • Kontravariatsiya (in): Tur va uning superturlarini ishlatishga imkon beradi. in bilan belgilangan. Misol uchun: Comparator<in String> Comparator<Any> bilan ishlashi mumkin. Qiymat iste'mol qiladigan turlar uchun ishlatiladi (masalan, kolleksiyaga yozish).
      interface Consumer<in T> { // in T - kontravariatsiya parametri
          fun consume(value: T)
      }
      
    • Invariyans: Tur va parametr aniq bir xil bo'lishi kerak. Bu default xulq.
  • Turlar cheklovlari (where): Parametr turini cheklash uchun, u ma'lum interfeyslarni amalga oshirishi yoki ma'lum bir sinfdan meros olishini ta'minlaydi.
    fun <T : Comparable<T>> max(a: T, b: T): T { // T Comparable ni amalga oshirishi kerak
        return if (a > b) a else b
    }
    
    fun <T> process(item: T) where T : Runnable, T : Comparable<T> {
        item.run()
        // ... solishtirish imkoniyati
    }
    
  • Yulduzcha (*) proektsiyasi: Turlar argumentlari muhim emas bo'lsa ishlatiladi. Java'dagi <?> ga o'xshaydi.
    fun printList(list: List<*>) { // Har qanday turdagi ro'yxat qabul qilinadi
         for (item in list) {
             println(item)
         }
    }
    

Kotlin'dagi umumiy turlar, Java'dagidek, turlar silinishini (type erasure) ishlatadi. Aniq turlar haqidagi ma'lumotlar ishga tushirish vaqtida yo'qoladi. Ishga tushirish vaqtida turlar bilan ishlash uchun reified turlar ishlatiladi.

  • Reified turlar (reified): Faqat inline funksiyalar uchun mavjud. Parametrning tur ma'lumotini ishga tushirish vaqtida saqlash imkonini beradi.
    inline fun <reified T> checkType(value: Any) { // T - reified tur
        if (value is T) {
            println("Qiymat T turidandir")
        } else {
            println("Qiymat T turida emas")
        }
    }