Middle
Kotlin-də ümumi tiplərlə necə işləmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin-də ümumi tiplər müxtəlif tiplərdəki məlumatlarla işləyən siniflər, interfeyslər və funksiyalar yaratmağa imkan verir və tiplərin təhlükəsizliyini tərtib zamanı saxlayır.
Əsas anlayışlar və işləmə üsulları:
- Ümumi sinif və interfeyslərin elan edilməsi:
class Box<T>(val item: T) // T parametrli ümumi sinif interface MyList<E> { // E parametrli ümumi interfeys fun add(element: E) fun get(index: Int): E } - Ümumi funksiyaların elan edilməsi:
fun <T> printAnything(value: T) { // T parametrli ümumi funksiya println(value) } - Ümumi tiplərin nümunələrinin yaradılması:
val intBox: Box<Int> = Box(123) // Konkret tipin göstərilməsi (Int) val stringBox = Box("hello") // Kompilyator tipini çıxarır (String) - Variantlar: Bu, ümumi tiplərlə alt tiplərin necə işlədiyini müəyyən etməyə imkan verir.
- Kovariatsiya (out): Tip və onun alt tiplərindən istifadə etməyə imkan verir.
outilə göstərilir. Məsələn:List<out Any>List<String>-i daxil edə bilər. Qiymət çıxaran tiplər üçün istifadə olunur (məsələn, kolleksiyadan oxumaq).interface Producer<out T> { // out T - kovariant parametr fun produce(): T } - Kontravariatsiya (in): Tip və onun super tiplərindən istifadə etməyə imkan verir.
inilə göstərilir. Məsələn:Comparator<in String>Comparator<Any>ilə işləyə bilər. Qiymət istehlak edən tiplər üçün istifadə olunur (məsələn, kolleksiyaya yazmaq).interface Consumer<in T> { // in T - kontravariant parametr fun consume(value: T) } - Invarianlıq: Tip tam olaraq eynidir. Bu, default davranışdır.
- Kovariatsiya (out): Tip və onun alt tiplərindən istifadə etməyə imkan verir.
- Tip məhdudiyyətləri (
where): Parametr tipini məhdudlaşdırmağa imkan verir ki, o müəyyən interfeysləri həyata keçirsin və ya müəyyən bir sinifdən irs alınsın.fun <T : Comparable<T>> max(a: T, b: T): T { // T Comparable-ı həyata keçirməlidir return if (a > b) a else b } fun <T> process(item: T) where T : Runnable, T : Comparable<T> { item.run() // ... müqayisə edilə bilənlikdən istifadə } - Ulduz (star) proyeksiyası (
*): Tiplərin konkret arqumentlərinin vacib olmadığı zaman istifadə olunur. Java'dakı<?>-yə bənzəyir.fun printList(list: List<*>) { // Hər hansı tiplə siyahı qəbul edə bilər for (item in list) { println(item) } }
Kotlin-də ümumi tiplər, Java kimi, tip silinməsi (type erasure) istifadə edir. Konkret tiplər haqqında məlumat işləmə zamanı itir. İşləmə zamanı tiplərlə işləmək üçün reified tiplər istifadə olunur.
- Reified tiplər (
reified): Yalnız inline funksiyalar üçün mövcuddur. Parametrin tip məlumatını işləmə zamanı saxlamağa imkan verir.inline fun <reified T> checkType(value: Any) { // T - reified tip if (value is T) { println("Dəyər T tipindədir") } else { println("Dəyər T tipində deyil") } }