Middle
Kotlin'da generik tiplari bilan qanday ishlash mumkin?
sobes.tech AI
AIdan javob
Kotlin'dagi umumiy turlar turli tiplardagi ma'lumotlar bilan ishlaydigan sinflar, interfeyslar va funksiyalarni yaratishga imkon beradi, shuningdek, kompilatsiya vaqtida tur xavfsizligini saqlaydi.
Asosiy tushunchalar va ishlash usullari:
- Umumiy sinflar va interfeyslarni e'lon qilish:
class Box<T>(val item: T) // T parametrli umumiy sinf interface MyList<E> { // E parametrli umumiy interfeys fun add(element: E) fun get(index: Int): E } - Umumiy funksiyalarni e'lon qilish:
fun <T> printAnything(value: T) { // T parametrli umumiy funksiya println(value) } - Umumiy turlar nusxalarini yaratish:
val intBox: Box<Int> = Box(123) // Aniq tur (Int) ko'rsatilgan val stringBox = Box("hello") // Kompilyator turini aniqlaydi (String) - Variantlar: Umumiy turlar bilan subtiplarning qanday ishlashini belgilash imkonini beradi.
- Kovariatsiya (out): Tur va uning subtiplarini ishlatishga imkon beradi.
outbilan belgilangan. Misol uchun:List<out Any>List<String>ni o'z ichiga olishi mumkin. Qiymat chiqaradigan turlar uchun ishlatiladi (masalan, kolleksiyalardan o'qish).interface Producer<out T> { // out T - kovariatsiya parametri fun produce(): T } - Kontravariatsiya (in): Tur va uning superturlarini ishlatishga imkon beradi.
inbilan belgilangan. Misol uchun:Comparator<in String>Comparator<Any>bilan ishlashi mumkin. Qiymat iste'mol qiladigan turlar uchun ishlatiladi (masalan, kolleksiyaga yozish).interface Consumer<in T> { // in T - kontravariatsiya parametri fun consume(value: T) } - Invariyans: Tur va parametr aniq bir xil bo'lishi kerak. Bu default xulq.
- Kovariatsiya (out): Tur va uning subtiplarini ishlatishga imkon beradi.
- Turlar cheklovlari (
where): Parametr turini cheklash uchun, u ma'lum interfeyslarni amalga oshirishi yoki ma'lum bir sinfdan meros olishini ta'minlaydi.fun <T : Comparable<T>> max(a: T, b: T): T { // T Comparable ni amalga oshirishi kerak return if (a > b) a else b } fun <T> process(item: T) where T : Runnable, T : Comparable<T> { item.run() // ... solishtirish imkoniyati } - Yulduzcha (
*) proektsiyasi: Turlar argumentlari muhim emas bo'lsa ishlatiladi. Java'dagi<?>ga o'xshaydi.fun printList(list: List<*>) { // Har qanday turdagi ro'yxat qabul qilinadi for (item in list) { println(item) } }
Kotlin'dagi umumiy turlar, Java'dagidek, turlar silinishini (type erasure) ishlatadi. Aniq turlar haqidagi ma'lumotlar ishga tushirish vaqtida yo'qoladi. Ishga tushirish vaqtida turlar bilan ishlash uchun reified turlar ishlatiladi.
- Reified turlar (
reified): Faqat inline funksiyalar uchun mavjud. Parametrning tur ma'lumotini ishga tushirish vaqtida saqlash imkonini beradi.inline fun <reified T> checkType(value: Any) { // T - reified tur if (value is T) { println("Qiymat T turidandir") } else { println("Qiymat T turida emas") } }