Обобщённые функции и классы
Параметризуйте типы
«Обобщённые функции и классы» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое обобщения
Обобщения позволяют писать код, работающий со множеством типов, сохраняя полную типобезопасность. Вместо конкретного типа используется параметр типа, часто T, выступающий в роли заполнителя.
Обобщённая функция
Обобщённая функция объявляет параметр типа в угловых скобках перед именем функции. Здесь T может быть любым типом.
fun <T> identity(value: T): T {
return value
}
fun main() {
println(identity(42))
println(identity("hello"))
}Вывод типов
Вам редко приходится указывать тип явно: компилятор выводит T из аргументов. При необходимости его всё же можно записать явно, например identity<Int>(42).
fun <T> firstOf(a: T, b: T): T = a
fun main() {
val x = firstOf(10, 20)
val y = firstOf("a", "b")
println("$x $y")
}Несколько параметров типа
У функции может быть несколько параметров типа, что удобно при работе с парами несвязанных типов.
fun <A, B> makePair(first: A, second: B): Pair<A, B> {
return Pair(first, second)
}
fun main() {
val p = makePair("age", 30)
println(p)
}Обобщённый класс
Классы тоже могут быть обобщёнными. Параметр типа объявляется после имени класса и может использоваться для свойств и функций.
class Box<T>(val value: T) {
fun get(): T = value
}
fun main() {
val intBox = Box(123)
val strBox = Box("Kotlin")
println(intBox.get())
println(strBox.get())
}Обобщённый класс с поведением
Обобщённые классы могут хранить изменяемое состояние и работать с параметром типа, подобно простому контейнеру.
class Stack<T> {
private val items = mutableListOf<T>()
fun push(item: T) { items.add(item) }
fun pop(): T = items.removeAt(items.size - 1)
fun isEmpty() = items.isEmpty()
}
fun main() {
val stack = Stack<Int>()
stack.push(1)
stack.push(2)
println(stack.pop())
}Обобщённые интерфейсы
Интерфейсы тоже могут объявлять параметры типа, позволяя реализациям выбирать конкретный тип.
interface Container<T> {
fun item(): T
}
class StringContainer : Container<String> {
override fun item(): String = "fixed"
}
fun main() {
println(StringContainer().item())
}Почему бы просто не использовать Any
Можно хранить значения как значения универсального типа, но при этом теряется информация о типе и требуются приведения. Обобщения сохраняют точный тип, поэтому компилятор обнаруживает ошибки и приведения не нужны.
fun main() {
val box: Box<String> = Box("text")
val s: String = box.get()
println(s.uppercase())
}
class Box<T>(val value: T) { fun get(): T = value }Обобщённые функции-расширения
Функции-расширения могут быть обобщёнными, что позволяет создавать повторно используемые вспомогательные средства для любых типов.
fun <T> T.printAndReturn(): T {
println("Value: $this")
return this
}
fun main() {
val x = 5.printAndReturn()
"hi".printAndReturn()
println(x)
}Соглашения об именовании
По соглашению параметры типа обозначают одной заглавной буквой: T — обобщённый тип, E — элемент, K и V — ключи и значения отображения, R — результат.
Обобщения повсюду
Стандартная библиотека Kotlin построена на обобщениях: List<T>, Map<K, V>, Pair<A, B>. Понимание обобщений помогает уверенно читать и использовать эти типы.
Быстрая проверка
В чём главное преимущество обобщений по сравнению с использованием универсального типа?
Итоги
Обобщения используют параметры типа, такие как T, чтобы создавать повторно используемые и типобезопасные функции, классы и интерфейсы. Компилятор выводит типы и обеспечивает безопасность, избавляя от приведений. Далее Вы узнаете, как управлять взаимосвязью обобщённых типов с помощью вариантности, объявленной в месте определения, используя in и out.
Часто задаваемые вопросы
Урок «Обобщённые функции и классы» бесплатный?
Да — полный текст урока «Обобщённые функции и классы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обобщённые функции и классы»?
Параметризуйте типы Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Обобщённые функции и классы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обобщённые функции и классы
- Вариативность на месте объявления
- Вариативность на месте использования
- Ограничения обобщений