Sobes.tech
Junior

Qaysi generyik turlarini bilasiz?

sobes.tech AI

AIdan javob

Niezmienni, kovarianti va kontravarianti.

  • Niezmienni: List<A> turi List<B> ning kichik turi emas va aksincha, hatto A B ning kichik turi bo‘lsa ham. Turi aniq saqlanadi.
  • Kovariantiya (out): Kichik turlarni ishlatishga imkon beradi. List<A> A B ning 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> A ning 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