Sobes.tech
Senior

Mit tud az csillagvetítés elvéről?

sobes.tech MI

Válasz az MI-től

A csillagprojekció (Star Projection) elve Kotlinban egy biztonságos módja a generikus típusok használatának, amikor nem fontos az argumentum konkrét típusa, de biztosítani kell a típusbiztonságot.

Ez a következő esetekben alkalmazható:

  • * : Egyenértékű a Any?-vel. Jelzi, hogy az argumentum típusa ismeretlen, és nincs információ a határértékeiről. Csak olyan elemek olvashatók, amelyek az Any? példányai, és semmit sem írhatunk, kivéve null-t.

    // Olvasás ismeretlen típusú listából
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Biztonságosan olvasható `Any?`-ként
    }
    
  • in * : Egyenértékű a in Nothing-nel. Kovaranciális típusok (out) esetén használják, amikor a konkrét alsó típus nem fontos. Csak elemek hozzáadása lehetséges (tipo Nothing, ami lehetetlen), de olvasni nem.

    // Biztonságosan nem lehet elemeket hozzáadni kovariáns listához
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Nem fordul le
    }
    
  • out * : Egyenértékű a out Any?-vel. Kontravaranciális típusok (in) esetén használják, amikor a felső típus nem fontos. Csak elemek olvashatók (mint az Any?), de nem írhatók.

    // Olvasás egy kontravaranciális típusú comparatorból
    fun compare(comparator: Comparator<in *>) {
        // Olyan metódusokat lehet hívni, amelyek NEM fogadják el a T típust
        // comparator.compare(obj1, obj2) // Nem fordul le típuskonverzió nélkül
    }
    

A csillagprojekciók fő célja, hogy biztonságosan kommunikáljanak generikus osztályokkal és függvényekkel, amikor az argumentum teljes típusa ismeretlen vagy nem lényeges a jelenlegi művelet szempontjából. Ez segít elkerülni a nem biztonságos castokat és fenntartani a típusbiztonságot.

Használati példák:

  • Csak az elemek létezése számít, nem pedig azok konkrét típusa esetén gyűjteményekkel való munka.
  • Típuskonverziók generikus objektumokra.
  • Raw típusokat használó Java-kódokkal való interoperabilitás.