Middle
Kotlinде жалпы түрлөр менен кантип иштеш керек?
sobes.tech AI
AIден жооп
Кеңейтилген типтер Kotlin'де ар кандай типтеги маалыматтар менен иштөөчү класстарды, интерфейстерди жана функцияларды түзүүгө мүмкүндүк берет, ошол эле учурда компиляция учурунда типтин коопсуздугун сактайт.
Негизги түшүнүктөр жана иштөө жолдору:
- Кеңейтилген класстар жана интерфейстерди жарыялоо:
class Box<T>(val item: T) // Кеңейтилген класс T тип параметри менен interface MyList<E> { // Кеңейтилген интерфейс E тип параметри менен fun add(element: E) fun get(index: Int): E } - Кеңейтилген функцияларды жарыялоо:
fun <T> printAnything(value: T) { // Кеңейтилген функция T тип параметри менен println(value) } - Кеңейтилген типтердин экземплярларын түзүү:
val intBox: Box<Int> = Box(123) // Такталган конкреттүү тип (Int) val stringBox = Box("hello") // Компилятор типти чыгарат (String) - Варианттык: Төмөнкү типтер менен иштөө жолдорун аныктоого мүмкүндүк берет.
- Коварианттык (out): Тип жана анын төмөнкү типтерин колдонууга мүмкүндүк берет.
outдеп белгиленет. Мисал:List<out Any>List<String>камтышы мүмкүн. Бул типтер, маанилерди чыгара турган (мисалы, коллекциядан окуу) үчүн колдонулат.interface Producer<out T> { // out T - коварианттык параметр fun produce(): T } - Контраварианттык (in): Тип жана анын жогорку типтерин колдонууга мүмкүндүк берет.
inдеп белгиленет. Мисал:Comparator<in String>Comparator<Any>менен иштей алат. Бул типтер, маанилерди керектөө үчүн (мисалы, коллекцияга жазуу) колдонулат.interface Consumer<in T> { // in T - контраварианттык параметр fun consume(value: T) } - Инварианттык: Тип так ошол эле болушу керек. Бул стандарттык жүрүм-турум.
- Коварианттык (out): Тип жана анын төмөнкү типтерин колдонууга мүмкүндүк берет.
- Тип чектөөлөрү (
where): Тип параметрин белгилүү интерфейстерди ишке ашырган же белгилүү классынан мурас алган болушу үчүн чектөө коюуга мүмкүндүк берет.fun <T : Comparable<T>> max(a: T, b: T): T { // T Comparable'ды ишке ашырган болушу керек return if (a > b) a else b } fun <T> process(item: T) where T : Runnable, T : Comparable<T> { item.run() // ... салыштыруу колдонуу } - Жұлдызча (star) проекциясы (
*): Конкреттүү тип аргументтери маанилүү эмес учурда колдонулат. Java'дагы<?>сыяктуу.fun printList(list: List<*>) { // Кандай гана тип болбосун тизмени кабыл алат for (item in list) { println(item) } }
Кеңейтилген типтер Kotlin'де типтердин өчүрүлүшүн (type erasure) колдонушат, Java сыяктуу. Конкреттүү тип параметрлери тууралуу маалымат ишке ашырылуу учурунда жоголот. Ишке ашыруу учурунда типтер менен иштөө үчүн reified типтери колдонулат:
- Reified типтери (
reified): Тек гана inline функциялар үчүн жеткиликтүү. Бул тип параметринин маалыматтарын ишке ашырылуу учурунда сактап калууга мүмкүндүк берет:inline fun <reified T> checkType(value: Any) { // T - reified тип if (value is T) { println("Value is of type T") } else { println("Value is not of type T") } }