Дар бораи принсипи призмасии ситора чӣ медонед?
sobes.tech AI
Ҷавоб аз AI
Принципи проексияи ситора (Star Projection) дар Kotlin усули бехатари истифодаи генерикҳоро дар вақте ки намоёни конкретии аргумент муҳим нест, аммо бояд бехатарии намудро таъмин кард.
Ин дар ҳолатҳои зерин истифода мешавад:
-
*: Баробар боAny?. Манзур аст, ки намоёни аргумент номаълум аст ва маълумот дар бораи марзҳояш вуҷуд надорад. Танҳо элементҳое, ки намунаиAny?мебошанд, метавонанд хонда шаванд ва ғайр аз null, ягон чиз нависда намешавад.// Хондан аз рӯйхати бо намоёни номаълум fun readFromList(list: List<*>) { val item: Any? = list.firstOrNull() // Бехатарона ҳамчун `Any?` хонда мешавад } -
in *: Баробар боin Nothing. Барои намудҳои ковариант (out) истифода мешавад, вақте ки намоёни поёнӣ муҳим нест. Танҳо элементҳоро илова кардан мумкин аст (tipo Nothing, ки имконнопазир аст), аммо хондан мумкин нест.// Имконнопазир аст, ки бехатар элементҳоро ба рӯйхати ковариант илова кунед fun addToList(list: MutableList<out *>) { // list.add(...) // Нест, ки кор кунад } -
out *: Баробар боout Any?. Барои намудҳои контравариант (in) истифода мешавад, вақте ки намоёни болоӣ муҳим нест. Танҳо элементҳоро хондан мумкин аст (мисли Any?), аммо навиштан мумкин нест.// Хондан аз муқоисгари контравариант fun compare(comparator: Comparator<in *>) { // Методҳоро метавон даъват кард, ки НАДО қабул мекунанд намоёни T // comparator.compare(obj1, obj2) // Бе тағйир додани намоён, кор намекунад }
Мақсади асосии проексияи ситора — бехатарона муошират бо синфҳо ва функсияҳои генерикӣ вақте ки намоёни пурра номаълум ё барои амали ҳозира муҳим нест. Ин кӯмак мекунад, ки аз қасдҳои бехатар истифода набарем ва бехатарии намудро нигоҳ дорем.
Маслиҳатҳои истифода:
- Кор бо ҷамъоварӣҳо, вақте ки танҳо ҳузури элементҳо муҳим аст, на намоёни онҳо.
- Табдили намудҳо барои объектҳои генерикӣ.
- Интероперабилитет бо коди Java, ки намудҳои raw-ро истифода мебарад.