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štipaList<B>un otrādi, pat jaAir apakštipsB. Tips tiek saglabāts precīzi. - Kovarianti (out): Atļauj izmantot apakštipus. Ja
Air apakštipsB, tadList<A>irList<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
Air apakštipsB, tadList<B>irList<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 | Jā | Jā |
| Kovarianti | Apakštipu izmantošana (producer - "out") | out |
? extends T |
Jā | Nē |
| Kontravarianti | Supertipu izmantošana (consumer - "in") | in |
? super T |
Nē | Jā |