Sobes.tech
Senior

Yıldız proyeksiyası prinsipindən nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də Ulduz Proyeksiyası (Star Projection) prinsipi, arqumentin konkret tipinin vacib olmadığı, lakin tip təhlükəsizliyinin təmin olunması lazım olduğu hallarda təhlükəsiz generik istifadəsidir.

Aşağıdakı hallarda tətbiq olunur:

  • * : Any? ilə bərabərdir. Arqumentin tipi məlum deyil və onun sərhədləri haqqında məlumat yoxdur. Yalnız Any? nümunəsi olan elementləri oxumaq mümkündür və null-dan başqa heç nə yaza bilməzsiniz.

    // Məlum olmayan tipli siyahıdan oxuma
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Təhlükəsiz şəkildə `Any?` kimi oxumaq olar
    }
    
  • in * : in Nothing ilə bərabərdir. Kovariant tiplər (out) üçün istifadə olunur, aşağı tipin konkret tipi vacib deyil. Yalnız elementlər əlavə etmək mümkündür (tipo Nothing, bu isə mümkün deyil), lakin oxumaq mümkün deyil.

    // Kovariant tipli siyahıya təhlükəsiz element əlavə etmək mümkün deyil
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Kompilyasiya olunmayacaq
    }
    
  • out * : out Any? ilə bərabərdir. Kontravarant tiplər (in) üçün istifadə olunur, yuxarı tip konkret deyil. Yalnız elementləri oxumaq mümkündür (Any? kimi), yazmaq mümkün deyil.

    // Kontravarant tipli müqayisəçi ilə oxuma
    fun compare(comparator: Comparator<in *>) {
        // T tipini qəbul etməyən metodları çağırmaq olar
        // comparator.compare(obj1, obj2) // Konversiya olmadan kompilyasiya olunmayacaq
    }
    

Ulduz proyeksiyalarının əsas məqsədi, arqumentin tam tipi məlum olmayan və ya cari əməliyyat üçün vacib olmayan hallarda, generik siniflər və funksiyalarla təhlükəsiz qarşılıqlı əlaqə qurmaqdır. Bu, təhlükəsiz olmayan cast-ləri qarşısını alır və tip təhlükəsizliyini qoruyur.

İstifadə nümunələri:

  • Yalnız elementlərin mövcudluğu vacib olan kolleksiyalarla işləmək, lakin onların konkret tipi vacib deyil.
  • Generik obyektlər üçün tip konvertasiyaları.
  • Raw tipləri istifadə edən Java kodu ilə qarşılıqlı əlaqə.