Generics позволяют писать переиспользуемый код, который работает с разными типами и при этом сохраняет типобезопасность на этапе компиляции. Вместо того чтобы писать отдельные классы или функции для каждого типа, ты определяешь параметр типа (например, T) как заглушку, которая разрешается на этапе компиляции.
class Box<T>(val value: T)
val intBox = Box(42) // Box<Int>
val strBox = Box("Hello") // Box<String>
Здесь Box<T> работает с любым типом. Компилятор выводит тип автоматически, поэтому явное приведение типов не требуется.
Generics также применяются к отдельным функциям:
fun <T> firstOrNull(list: List<T>): T? {
return list.firstOrNull()
}
Эта одна функция работает с List<Int>, List<String> или любым другим типом.
Kotlin также поддерживает модификаторы вариативности для контроля того, как универсальные типы соотносятся друг с другом:
out T (ковариативность) — тип может только производиться, позволяя использовать подтипыin T (контравариативность) — тип может только потребляться, позволяя использовать супертипыclass Producer<out T>(val value: T)
Generics — это необходимый инструмент для написания чистого, переиспользуемого и типобезопасного кода. Они устраняют дублирование, исключают небезопасные приведения типов и дают компилятору возможность обеспечить корректность — делая твой код одновременно безопаснее и проще в поддержке.
Обобщения в Kotlin используют параметры типов вроде T в качестве плейсхолдеров, которые разрешаются на этапе компиляции, позволяя компилятору выловить несоответствия типов ещё на стадии компиляции, а не во время выполнения.
Новый — ещё не проверен сообществом
Вы