Псевдонимы типов
Псевдонимы типов предоставляют альтернативные имена для существующих типов. Они помогают сделать длинные или часто используемые выражения типов короче и понятнее.
Например, можно создавать псевдонимы для обобщённых типов, функциональных типов, а также вложенных или внутренних классов:
// Generic types
typealias UserIndex = Map<Long, User>
typealias FileTable<K> = MutableMap<K, MutableList<File>>
// Function types
typealias RequestHandler = (Request) -> Response
typealias Predicate<T> = (T) -> Boolean
// Inner and nested classes
class Database {
inner class Transaction
}
typealias DatabaseTransaction = Database.Transaction
Псевдоним типа не создаёт новый тип. Он вводит альтернативное имя для существующего типа. Псевдоним и лежащий в его основе тип взаимозаменяемы. Например, если добавить typealias Predicate<T> и использовать Predicate<Int>, компилятор преобразует это в (Int) -> Boolean. Значение, объявленное с помощью псевдонима, можно использовать везде, где ожидается лежащий в его основе тип, и наоборот:
typealias Predicate<T> = (T) -> Boolean
fun evaluate(predicate: Predicate<Int>) = predicate(42)
fun main() {
val isPositive: (Int) -> Boolean = { it > 0 }
println(evaluate(isPositive))
// true
val isValid: Predicate<Int> = { it > 0 }
println(listOf(1, -2).filter(isValid))
// [1]
}
Объявление псевдонимов типов
Псевдоним типа можно объявить:
На верхнем уровне файла Kotlin — как верхнеуровневый псевдоним типа.
Внутри класса, интерфейса или объекта — как вложенный псевдоним типа.
Нельзя объявить псевдоним типа в локальной области видимости, например внутри функции или лямбда-выражения.
Место объявления определяет область видимости псевдонима типа, а его видимость определяет, какой код может к нему обращаться. По умолчанию псевдоним типа имеет видимость public. К вложенному псевдониму типа можно обратиться только там, где доступен содержащий его класс, интерфейс или объект. Например, псевдоним public внутри класса internal недоступен за пределами модуля.
Псевдоним типа не может предоставлять доступ к лежащему в его основе типу с более строгой видимостью, чем у самого псевдонима. Например, псевдоним типа public не может ссылаться на класс private.
Верхнеуровневые псевдонимы типов
Верхнеуровневый псевдоним типа — это объявление на уровне пакета. В том же пакете на псевдоним можно ссылаться по неквалифицированному имени. Чтобы использовать псевдоним из другого пакета, импортируйте его или укажите его полное имя:
// UserId.kt
package org.example.users
typealias UserId = Long
// Refers to the alias within the same package by its unqualified name
fun createUser(id: UserId) {
// ...
}
// UserService.kt
package org.example.services
import org.example.users.UserId
// Uses the imported alias by its unqualified name
fun findUser(id: UserId) {
// ...
}
// Uses the fully qualified name
fun deleteUser(id: org.example.users.UserId) {
// ...
}
Вложенные псевдонимы типов
Вложенные псевдонимы типов делают код чище и упрощают его сопровождение: они улучшают инкапсуляцию, уменьшают загромождение на уровне пакета и упрощают внутренние реализации. Для вложенных псевдонимов типов действуют те же правила областей видимости и разрешения имён, что и для вложенных классов.
Объявляйте псевдоним типа внутри класса, интерфейса или объекта, если альтернативное имя имеет смысл только в контексте этого объявления. Так псевдоним будет находиться рядом с использующим его кодом, и в области видимости пакета не появится ещё одно имя.
Внутри содержащего объявления на псевдоним можно ссылаться по неквалифицированному имени. За пределами объявления указывайте имя содержащего объявления перед именем псевдонима:
class UserRepository {
typealias UserIndex = Map<UserId, User>
// Refers to the alias by its unqualified name inside UserRepository
fun saveAll(users: UserIndex) {
// ...
}
}
// Refers to the alias by its qualified name outside UserRepository
fun synchronizeUsers(users: UserRepository.UserIndex) {
// ...
}
Параметры типа
Чтобы использовать параметры типа во вложенном псевдониме типа, добавьте их в объявление псевдонима:
class Graph<Node> {
typealias Path<T> = List<T>
}
val cityPath: Graph.Path<String> = listOf("London", "Berlin")
В этом примере Path объявляет параметр типа T. В Graph.Path<String>, String является аргументом типа для T и не зависит от параметра типа Node, объявленного в Graph.
Если сослаться на параметр типа, объявленный содержащим классом или интерфейсом, компилятор сообщит об ошибке:
class Graph<Node> {
typealias Path = List<Node>
// Unresolved reference 'Node'.
}
Здесь Path ссылается на Node из Graph, а не объявляет собственный параметр типа.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/type-aliases.html