0Pricing
Kotlin Academy · Урок

Обобщённые функции и классы

Параметризуйте типы

«Обобщённые функции и классы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обобщённые функции и классы
  2. Вариативность на месте объявления
  3. Вариативность на месте использования
  4. Ограничения обобщений
← Назад к Kotlin Academy