Sobes.tech
Senior

Šta znate o principu zvezdne projekcije?

sobes.tech АИ

Одговор од АИ

Princip prozorcije zvezda (Star Projection) u Kotlinu je siguran način za korišćenje generika kada konkretan tip argumenta nije važan, ali je potrebno obezbediti sigurnost tipova.

Primjenjuje se u sledećim slučajevima:

  • * : Ekvivalentno je sa Any?. Ukazuje da je tip argumenta nepoznat i da nema informacija o njegovim granicama. Može se čitati samo elemente koji su instance Any?, i ne može se ništa zapisivati osim null.

    // Čitanje iz liste sa nepoznatim tipom
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Može se sigurno čitati kao Any?
    }
    
  • in * : Ekvivalentno je sa in Nothing. Koristi se za kovarijantne tipove (out), kada nije važan konkretan donji tip. Može se samo dodavati elemente (tipa Nothing, što je nemoguće), ali ne i čitati.

    // Nemoguće je sigurno dodavati elemente u kovarijantnu listu
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Neće se kompajlirati
    }
    
  • out * : Ekvivalentno je sa out Any?. Koristi se za kontravariantne tipove (in), kada nije važan konkretan gornji tip. Može se samo čitati elementi (kao Any?), ali ne i zapisivati.

    // Čitanje iz kontravariantnog komparatora
    fun compare(comparator: Comparator<in *>) {
        // Može se pozvati metode koje NE prihvataju tip T
        // comparator.compare(obj1, obj2) // Neće se kompajlirati bez konverzije tipa
    }
    

Glavni cilj star projekcija je sigurna interakcija sa generičkim klasama i funkcijama kada kompletan tip argumenta nije poznat ili nije važan za trenutnu operaciju. Ovo pomaže da se izbegnu unsafe cast-ovi i da se održi sigurnost tipova.

Primeri upotrebe:

  • Rad sa kolekcijama gde je važan samo činjenica postojanja elemenata, a ne njihov konkretan tip.
  • Konverzija tipova za generičke objekte.
  • Interoperabilnost sa Java kodom koji koristi raw tipove.