Чӣ гуна бехатарии навъҳоро дар Kotlin таъмин кардан мумкин аст?
sobes.tech AI
Ҷавоб аз AI
Амниятиии типҳо дар Kotlin дар вақти компилятсия тавассути чанд механизмҳои калидӣ таъмин карда мешаванд:
-
Системаи типҳои нол-неъматӣ: Kotlin фарқ мекунад байни типҳои истинодӣ, ки метавонанд арзиши
nullқабул кунанд (бо?дар охири номи тип нишон дода мешавад), ва онҳое, ки наметавонанд. Компилятор талаб мекунад, ки бароиnullсанҷишҳои ошкоро ё истифодаи зангҳои бехатартар (?.) ва операторҳо (?:,!!) анҷом дода шаванд.// Номусоии, ки наметавонад null бошад val nonNullableString: String = "Hello" // Номусоии, ки метавонад null бошад var nullableString: String? = "World" nullableString = null // иҷозат дода шудааст // Хатогии компилятсия: ниёз ба коркарди null // val length = nullableString.length // Зангҳои бехатартар val length: Int? = nullableString?.length // Оператор Elvis val safeLength: Int = nullableString?.length ?: 0 -
Smart Casts: Компилятор автоматӣ навъи тағйирёбандаро дар дохили блокҳои
if,when,while,forва дигар ифодаҳо пас аз санҷиши навъ ёnullтағйир медиҳад.fun printLength(obj: Any) { if (obj is String) { // Дар дохили ин блок, компилятор медонад, ки obj String аст println("Дарозии String: ${obj.length}") } } fun processNullableString(str: String?) { if (str != null) { // Дар дохили ин блок, компилятор медонад, ки str null нест println("String не null, дарозӣ: ${str.length}") } } -
Типҳои умумӣ (Generics): Kotlin қолабҳоро дастгирӣ мекунад, ки имкон медиҳанд, ки синфҳо, интерфейсҳо ва функсияҳо бо намудҳои гуногун кор кунанд, бо таъмини бехатарии навъҳо дар вақти компилятсия.
class Box<T>(val item: T) fun printItem(box: Box<String>) { // Компилятор медонад, ки item String аст println(box.item.uppercase()) } -
Ковариансия (
out) ва контравариансия (in): Имкон медиҳанд, ки чӣ гуна подтипҳо дар типҳои умумӣ истифода мешаванд, то хатогиҳои номувофиқии навъҳоро дар вақти компилятсия пешгирӣ кунанд.interface Source<out T> { fun nextT(): T // fun consumeT(t: T) // Хатогӣ дар компилятсия } interface Sink<in T> { // fun produceT(): T // Хатогӣ дар компилятсия fun consumeT(t: T) } -
Классҳои sealed: Инҳоянд, ки як иерархияи маҳдудро намояндагӣ мекунанд, ки дар вақти компилятсия ҳамаи субклассҳо маълуманд. Ин ба компилятор имкон медиҳад, ки пурра будани изразҳои
whenбо субклассҳоиsealed-ро тафтиш кунад, ва ҳамаи ҳолатҳоро баррасӣ кунад.sealed class Result { data class Success(val data: String) : Result() data class Error(val code: Int) : Result() } fun handleResult(result: Result) { when (result) { is Result.Success -> println("Маълумот: ${result.data}") is Result.Error -> println("Хатогӣ: ${result.code}") // Бе 'else', компилятор кафолат медиҳад, ки ҳамаи субклассҳо баррасӣ шудаанд } }
Ин механизмҳо дар якҷоягӣ кор мекунанд, ва имкон медиҳанд, ки бисёр хатогиҳои эҳтимолиро, ки бо навъҳо алоқаманданд, дар марҳилаи аввали таҳия ошкор кунанд, пеш аз оғози иҷрои барнома.