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õrdneAny?. Näitab, et argumenti tüüp on teadmata ja selle piiranguid ei ole. Saab ainult lugeda elemente, mis onAny?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õrdnein 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õrdneout Any?. Kasutatakse kontravariantsetel tüüpidel (in), kui ei ole oluline konkreetne ülemine tüüp. Saab ainult lugeda elemente (naguAny?), 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.