Sobes.tech
Junior

Kādus ģenēriskos medikamentus pazīstat?

sobes.tech AI

Atbilde no AI

Invarianti, kovarianti un kontravarianti.

  • Invarianti: Tips List<A> nav ir apakštipa List<B> un otrādi, pat ja A ir apakštips B. Tips tiek saglabāts precīzi.
  • Kovarianti (out): Atļauj izmantot apakštipus. Ja A ir apakštips B, tad List<A> ir List<B> apakštips. Izmanto izejas parametriem (atgriešanas vērtībām).
fun foo(list: List<out Number>) {
    // Var lasīt no saraksta (Number, Double, Int utt.)
    val number: Number = list[0]
    // Nav atļauts pievienot sarakstam (nav zināms, kāda tipa elementi tiek gaidīti)
    // list.add(1) // Kompilācijas kļūda
}
  • Kontravarianti (in): Atļauj izmantot supertipus. Ja A ir apakštips B, tad List<B> ir List<A> apakštips. Izmanto ieejas parametriem.
fun foo(comparable: Comparable<in String>) {
    // Var nodot String vai tā supertipus
    val result = comparable.compareTo("hello")
    // Nav iespējams saņemt rezultātus kā String (nav zināms, kāda ir rezultāta tips)
    // val str: String = comparable.compareTo("world") // Kompilācijas kļūda
}

Kotlin šīs koncepcijas realizē ar out un in anotācijām uz tipu parametriem. Java izmanto wildcards (? extends un ? super).

Tips Mērķis Atslēgvārds (Kotlin) Wildcard (Java) Lasīšana atļauta Rakstīšana atļauta
Invarianti Precīza tipa atbilstība Nav Nav
Kovarianti Apakštipu izmantošana (producer - "out") out ? extends T
Kontravarianti Supertipu izmantošana (consumer - "in") in ? super T