Sobes.tech
Senior

Mida te teate tähtede projektsiooni põhimõttest?

sobes.tech AI

Vastus AI-lt

Tärniprojektsioon (Star Projection) Kotlinis — see on ohutu viis kasutada generikke, kui argumenti konkreetne tüüp ei ole oluline, kuid on vaja tagada tüübikindlus.

Seda kasutatakse järgmistel juhtudel:

  • *: on võrdne Any?. Näitab, et argumenti tüüp on teadmata ja selle piiranguid ei ole. Saab ainult lugeda elemente, mis on Any? näited, ning ei saa kirjutada midagi peale nulli.

    // Lugemine teadmata tüüpi nimekirjast
    fun readFromList(list: List<*>) {
        val item: Any? = list.firstOrNull()
        // Ohutu lugemine kui `Any?`
    }
    
  • in *: on võrdne in Nothing. Kasutatakse kovariantsetel tüüpidel (out), kui ei ole oluline konkreetne alumine tüüp. Saab ainult kirjutada elemente (tüüp Nothing, mis on võimatu), kuid mitte lugeda.

    // Ohutu elementide lisamine kovariantsele nimekirjale ei ole võimalik
    fun addToList(list: MutableList<out *>) {
        // list.add(...) // Ei kompileeru
    }
    
  • out *: on võrdne out Any?. Kasutatakse kontravariantsetel tüüpidel (in), kui ei ole oluline konkreetne ülemine tüüp. Saab ainult lugeda elemente (nagu Any?), kuid mitte kirjutada.

    // Lugemine kontravariantse komparatoriga
    fun compare(comparator: Comparator<in *>) {
        // Võib kutsuda meetodeid, mis ei võta T tüüpi
        // comparator.compare(obj1, obj2) // Ei kompileeru ilma tüübi ümberkonverteerimiseta
    }
    

Peamine eesmärk on ohutu suhtlus generikaklasside ja funktsioonidega, kui kogu tüüp on teadmata või ei ole oluline praeguse operatsiooni jaoks. See aitab vältida unsafe cast'e ja säilitada tüübikindlust.

Kasutusnäited:

  • Töö kogumitega, kui oluline on ainult elementide olemasolu, mitte nende konkreetne tüüp.
  • Tüüpide konverteerimine generikobjektidele.
  • Interoperability Java-koodiga, mis kasutab raw-tüüpe.