Sobes.tech
Middle

Чӣ гуна бо намудҳои умумӣ дар Kotlin кор кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Типҳои умумӣ дар Kotlin имкон медиҳанд, ки синфҳо, интерфейсҳо ва функсияҳо бо маълумоти намудҳои гуногун кор кунанд, ҳангоми нигоҳ доштани бехатарии намуд дар вақти компилятсия.

Маълумоти асосӣ ва усулҳои кор:

  • Эълон кардани синфҳо ва интерфейсҳои умумӣ:
    class Box<T>(val item: T) // Синфи умумӣ бо параметри намуд T
    interface MyList<E> { // Интерфейси умумӣ бо параметри намуд E
        fun add(element: E)
        fun get(index: Int): E
    }
    
  • Эълон кардани функсияҳои умумӣ:
    fun <T> printAnything(value: T) { // Функсияи умумӣ бо параметри намуд T
        println(value)
    }
    
  • Сохтани намунаҳои намудҳои умумӣ:
    val intBox: Box<Int> = Box(123) // Нақшаи намудро муайян мекунад (Int)
    val stringBox = Box("hello") // Компилятор намудро мебинад (String)
    
  • Вариантӣ: Имкон медиҳад, ки чӣ гуна намудҳои зерсохтор бо намудҳои умумӣ кор мекунанд.
    • Ковариантӣ (out): Имкон медиҳад, ки намуд ва зерсохторҳои он истифода шаванд. Нишон дода мешавад бо out. Масалан: List<out Any> метавонад дар бар гирад List<String>. Барои намудҳое, ки арзишҳоро истеҳсол мекунанд (масалан, хондан аз ҷамъоварӣ).
      interface Producer<out T> { // out T - параметри ковариант
           fun produce(): T
      }
      
    • Контравариантӣ (in): Имкон медиҳад, ки намуд ва намудҳои болоии он истифода шаванд. Нишон дода мешавад бо in. Масалан: Comparator<in String> метавонад бо Comparator<Any> кор кунад. Барои намудҳое, ки арзишҳоро истеъмол мекунанд (масалан, навиштан ба ҷамъоварӣ).
      interface Consumer<in T> { // in T - параметри контравариант
          fun consume(value: T)
      }
      
    • Инвариантӣ: Намуди дар параметри умумӣ бояд комилан якхела бошад. Ин хоси пешфарз аст.
  • Маҳдудиятҳои намуд (where): Имкон медиҳад, ки намудро маҳдуд кунед, то ки он иҷрои баъзе интерфейсҳо ё аз синфҳои муайян мерос гирад.
    fun <T : Comparable<T>> max(a: T, b: T): T { // T бояд Comparable-ро иҷро кунад
        return if (a > b) a else b
    }
    
    fun <T> process(item: T) where T : Runnable, T : Comparable<T> {
        item.run()
        // ... истифодаи муқоиса
    }
    
  • Пешбарии (star) (*): Ҳангоми истифода мешавад, ки аргументҳои муайян муҳим нестанд. Мисли <?> дар Java.
    fun printList(list: List<*>) { // Мебарояд, ки рӯйхати ҳар намудро қабул кунад
         for (item in list) {
             println(item)
         }
    }
    

Типҳои умумии Kotlin аз бардоштани намуд (type erasure) истифода мебаранд, монанди Java. Маълумоти дар бораи намудҳои муайян дар вақти иҷро гум мешавад. Барои кор бо намудҳо дар вақти иҷро истифода мешаванд типҳои reified.

  • Типҳои reified (reified): Танҳо барои функсияҳои inline дастрасанд. Имкон медиҳанд, ки маълумоти дар бораи намудро дар вақти иҷро нигоҳ доранд.
    inline fun <reified T> checkType(value: Any) { // T - тип reified
        if (value is T) {
            println("Value is of type T")
        } else {
            println("Value is not of type T")
        }
    }