Junior
Qaysi generyik turlarini bilasiz?
sobes.tech AI
AIdan javob
Niezmienni, kovarianti va kontravarianti.
- Niezmienni:
List<A>turiList<B>ning kichik turi emas va aksincha, hattoABning kichik turi bo‘lsa ham. Turi aniq saqlanadi. - Kovariantiya (out): Kichik turlarni ishlatishga imkon beradi.
List<A>ABning kichik turi bo‘lsa,List<B>ning kichik turidir. Chiqish parametrlar uchun ishlatiladi.
fun foo(list: List<out Number>) {
// Ro‘yxatdan o‘qish mumkin (Number, Double, Int va boshqalar)
val number: Number = list[0]
// Ro‘yxaga qo‘shish mumkin emas (qaysi turdagi elementlar kutilayotganini bilmaymiz)
// list.add(1) // Kompilyatsiya xatosi
}
- Kontravariantiya (in): Super-turlarni ishlatishga imkon beradi.
List<B>Aning kichik turi bo‘lsa,List<A>ning kichik turidir. Kirish parametrlar uchun ishlatiladi.
fun foo(comparable: Comparable<in String>) {
// String yoki uning super-turlarini argument sifatida berish mumkin
val result = comparable.compareTo("hello")
// String turidagi natijalarni olish mumkin emas (qaysi turdagi natija aniq emas)
// val str: String = comparable.compareTo("world") // Kompilyatsiya xatosi
}
Kotlinda bu tushunchalar out va in annotatsiyalari bilan parametr turlarida amalga oshiriladi. Java'da wildcards (? extends va ? super) ishlatiladi.
| Tur | Maqsad | Kalit so‘z (Kotlin) | Wildcard (Java) | O‘qish ruxsat etilgan | Yozish ruxsat etilgan |
|---|---|---|---|---|---|
| Niezmienniczy | To‘g‘ri moslik tipi | Yo‘q | Yo‘q | Ha | Ha |
| Kovariantiya | Kichik turlarni ishlatish (producent - "out") | out |
? extends T |
Ha | Yo‘q |
| Kontravariantiya | Super-turlarni ishlatish (konsumsiya - "in") | in |
? super T |
Yo‘q | Ha |