Умные приведения типов
Автоматически приводите тип после проверок
«Умные приведения типов» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое умные приведения
После проверки типа значения Kotlin запоминает этот факт. Внутри проверенного блока он автоматически рассматривает значение как более узкий тип.
Эта возможность называется умным приведением и избавляет от ручного приведения типов.
Умное приведение после is
После успешной проверки is Вы можете использовать значение как значение этого типа, не записывая приведение.
Компилятор вставляет его за Вас.
fun describe(x: Any) {
if (x is String) {
println(x.length) // x is smart-cast to String
}
}
fun main() {
describe("hello")
}Умное приведение после проверки на null
Умные приведения работают и с допустимостью null. После подтверждения того, что значение не равно null, оно рассматривается как не допускающее null.
fun length(text: String?): Int {
if (text != null) {
return text.length // smart-cast to non-null String
}
return 0
}
fun main() {
println(length("abc"))
println(length(null))
}Умные приведения в when
Проверки типов внутри when также включают умные приведения в каждой ветви.
Это идиоматичный способ обработки нескольких возможных типов.
fun area(shape: Any): Double = when (shape) {
is Int -> shape.toDouble()
is String -> shape.length.toDouble()
else -> 0.0
}
fun main() {
println(area(5))
println(area("hello"))
}Умное приведение при досрочном возврате
Если при обнаружении null Вы сразу выполняете возврат, компилятор понимает, что после этого значение не равно null.
Остальная часть функции безопасно использует это значение.
fun process(text: String?) {
if (text == null) return
println(text.uppercase()) // smart-cast here
}
fun main() {
process("data")
process(null)
}Умное приведение при возврате через Elvis
Сочетание Elvis с return также включает умное приведение для оставшегося кода.
fun process(text: String?) {
val safe = text ?: return
println(safe.length) // safe is non-null
}
fun main() {
process("hi")
process(null)
}Объединённые условия
Умные приведения учитывают логику объединённых условий с использованием &&.
После проверки типа слева правая часть уже видит более узкий тип.
fun check(x: Any) {
if (x is String && x.length > 3) {
println("long string")
} else {
println("other")
}
}
fun main() {
check("hello")
check(2)
}Когда умные приведения не работают
Для умных приведений нужна гарантия, что значение не изменится между проверкой и использованием.
Изменяемая var, которая может измениться одновременно, может не получить умное приведение. Для надёжных умных приведений предпочитайте val.
fun main() {
val text: String? = "stable"
if (text != null) {
println(text.length) // val smart-casts cleanly
}
}Локальное val безопаснее всего
Копирование значения в локальную val делает умные приведения надёжными.
Это распространённый приём при работе со свойствами, допускающими null.
class Box(val content: String?)
fun main() {
val box = Box("item")
val c = box.content
if (c != null) {
println(c.uppercase())
}
}Умное и явное приведение
Умные приведения заменяют большинство явных приведений с помощью as. Они безопаснее, поскольку применяются только там, где тип доказан.
Далее Вы изучите явные операторы is и as.
fun main() {
val x: Any = "text"
if (x is String) {
// no need for (x as String)
println(x.reversed())
}
}Соберём всё вместе
Умные приведения позволяют компилятору автоматически сужать типы:
- После проверок
is→ приведение к этому типу - После проверок на null → приведение к типу, не допускающему null
- Работают в
if,whenи после досрочных возвратов - Наиболее надёжны с
val
fun render(x: Any): String {
if (x is Int) return "number " + x
if (x is String) return "text " + x.uppercase()
return "unknown"
}
fun main() {
println(render(7))
println(render("go"))
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли умные приведения.
Итоги
Вы узнали об умных приведениях:
- Проверки типа и null автоматически сужают тип
- Они работают в
if,whenи после досрочных возвратов valобеспечивает наиболее надёжные умные приведения
Далее Вы изучите непосредственно операторы is и as.
Часто задаваемые вопросы
Урок «Умные приведения типов» бесплатный?
Да — полный текст урока «Умные приведения типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Умные приведения типов»?
Автоматически приводите тип после проверок Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Умные приведения типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- when как выражение
- Умные приведения типов
- Операторы is и as
- Исчерпывающий when