Sobes.tech
Middle

Kaip dirbti su bendrais tipais Kotlin?

sobes.tech AI

Atsakymas iš AI

Bendriami tipai Kotlin leidžia kurti klases, sąsajas ir funkcijas, kurios dirba su skirtingų tipų duomenimis, išlaikydamos tipų saugumą kompiliavimo metu.

Pagrindinės sąvokos ir darbo būdai:

  • Bendrių klasių ir sąsajų deklaravimas:
    class Box<T>(val item: T) // Bendroji klasė su T tipo parametru
    interface MyList<E> { // Bendroji sąsaja su E tipo parametru
        fun add(element: E)
        fun get(index: Int): E
    }
    
  • Bendrų funkcijų deklaravimas:
    fun <T> printAnything(value: T) { // Bendroji funkcija su T tipo parametru
        println(value)
    }
    
  • Bendrų tipų pavyzdžių kūrimas:
    val intBox: Box<Int> = Box(123) // Nurodytas konkretus tipas (Int)
    val stringBox = Box("hello") // Kompiliatorius išves tipą (String)
    
  • Įvairovė: Leidžia nustatyti, kaip veikia pogrupiai su bendrais tipais.
    • Kovariantiškumas (out): Leidžia naudoti tipą ir jo pogrupius. Žymima out. Pavyzdys: List<out Any> gali turėti List<String>. Naudojama tipams, kurie generuoja reikšmes (pvz., skaityti iš kolekcijos).
      interface Producer<out T> { // out T - kovariantiškas parametras
           fun produce(): T
      }
      
    • Kontravarantiškumas (in): Leidžia naudoti tipą ir jo viršutinius tipus. Žymima in. Pavyzdys: Comparator<in String> gali dirbti su Comparator<Any>. Naudojama tipams, kurie naudoja reikšmes (pvz., rašyti į kolekciją).
      interface Consumer<in T> { // in T - kontravarantiškas parametras
          fun consume(value: T)
      }
      
    • Invariantiškumas: Tipas bendrame parametre turi būti tiksliai toks pats. Tai numatytasis elgesys.
  • Tipų apribojimai (where): Leidžia apriboti parametro tipą, kad jis įgyvendintų tam tikras sąsajas arba paveldėtų iš tam tikros klasės.
    fun <T : Comparable<T>> max(a: T, b: T): T { // T turi įgyvendinti Comparable
        return if (a > b) a else b
    }
    
    fun <T> process(item: T) where T : Runnable, T : Comparable<T> {
        item.run()
        // ... naudojame palyginimą
    }
    
  • Žvaigždutė (star) projekcija (*): Naudojama, kai konkrečių tipų argumentai nėra svarbūs. Panaši į <?> Java.
    fun printList(list: List<*>) { // Priima bet kokio tipo sąrašą
         for (item in list) {
             println(item)
         }
    }
    

Kotlin bendrieji tipai naudoja tipų ištrynimą (type erasure), kaip ir Java. Informacija apie konkrečius tipų parametrus prarandama vykdymo metu. Darbo su tipais vykdymo metu naudojami reified tipai:

  • Reified tipai (reified): Pasiekiami tik inline funkcijose. Leidžia išsaugoti informaciją apie tipo parametrą vykdymo metu:
    inline fun <reified T> checkType(value: Any) { // T - reified tipas
        if (value is T) {
            println("Value is of type T")
        } else {
            println("Value is not of type T")
        }
    }