Sobes.tech
Senior

Co víte o principu hvězdné projekce?

sobes.tech AI

Odpověď od AI

Princip starové projekce (Star Projection) v Kotlinu je bezpečný způsob, jak používat generika, když není důležitý konkrétní typ argumentu, ale je třeba zajistit typovou bezpečnost.

Používá se v následujících případech:

  • * : Je ekvivalentní s Any?. Označuje, že typ argumentu je neznámý a nejsou k dispozici žádné informace o jeho hranicích. Lze číst pouze prvky, které jsou instancemi Any?, a nelze zapisovat nic jiného než null.

    // Čtení z neznámého typu seznamu
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Lze bezpečně číst jako `Any?`
    }
    
  • in * : Je ekvivalentní s in Nothing. Používá se pro kovariantní typy (out), když není důležitý konkrétní spodní typ. Lze pouze přidávat prvky (typ Nothing, což je nemožné), ale nelze číst.

    // Není možné bezpečně přidávat prvky do kovariantního seznamu
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Nepřekompiluje se
    }
    
  • out * : Je ekvivalentní s out Any?. Používá se pro kontravariantní typy (in), když není důležitý konkrétní horní typ. Lze pouze číst prvky (jako Any?), ale nelze zapisovat.

    // Čtení z kontravariantního komparátoru
    fun compare(comparator: Comparator<in *>) {
        // Můžete volat metody, které NEpřijímají typ T
        // comparator.compare(obj1, obj2) // Nepřekompiluje se bez konverze typu
    }
    

Hlavním cílem starových projekcí je bezpečná interakce s generickými třídami a funkcemi, když úplný typ argumentu je neznámý nebo není pro aktuální operaci důležitý. Pomáhá to zabránit nebezpečným přetypováním a zachovat typovou bezpečnost.

Příklady použití:

  • Práce se sbírkami, kde je důležité pouze existence prvků, nikoli jejich konkrétní typ.
  • Převody typů pro generické objekty.
  • Interoperabilita s Java kódem používajícím raw typy.