Sobes.tech
Senior

Čo viete o princípe hviezdnej projekcie?

sobes.tech AI

Odpoveď od AI

Princíp hviezdnej projekcie (Star Projection) v Kotlin je bezpečný spôsob používania generík, keď nie je dôležitý konkrétny typ argumentu, ale je potrebné zabezpečiť typovú bezpečnosť.

Používa sa v nasledujúcich prípadoch:

  • * : Je ekvivalentný s Any?. Označuje, že typ argumentu je neznámy a nie sú k dispozícii informácie o jeho hraniciach. Môžu sa čítať iba prvky, ktoré sú inštanciami Any?, a nie je možné zapisovať nič okrem null.

    // Čítanie z neznámeho typu zoznamu
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Môže sa bezpečne čítať ako `Any?`
    }
    
  • in * : Je ekvivalentný s in Nothing. Používa sa pre kovariantné typy (out), keď nie je dôležitý konkrétny spodný typ. Môžu sa pridávať iba prvky (tipo Nothing, čo je nemožné), ale nie je možné čítať.

    // Nie je možné bezpečne pridávať prvky do kovariantného zoznamu
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Nebude sa kompilovať
    }
    
  • out * : Je ekvivalentný s out Any?. Používa sa pre kontravariantné typy (in), keď nie je dôležitý konkrétny horný typ. Môžu sa čítať iba prvky (ako Any?), ale nie je možné zapisovať.

    // Čítanie z kontravariabilného komparátora
    fun compare(comparator: Comparator<in *>) {
        // Môžete volať metódy, ktoré NEMôžu prijať typ T
        // comparator.compare(obj1, obj2) // Nebude sa kompilovať bez konverzie typu
    }
    

Hlavným cieľom star projekcií je bezpečná interakcia s generickými triedami a funkciami, keď úplný typ argumentu nie je známy alebo nie je dôležitý pre aktuálnu operáciu. To pomáha predísť nebezpečným castom a zachovať typovú bezpečnosť.

Príklady použitia:

  • Práca s kolekciami, kde je dôležitý iba fakt existencie prvkov, nie ich konkrétny typ.
  • Konverzie typov pre generické objekty.
  • Interoperabilita s Java kódom, ktorý používa raw typy.