Проверка типов и приведение типов
Операторы is и !is
Используйте оператор is или его отрицательную форму !is для выполнения проверки во время выполнения, определяющей, соответствует ли объект заданному типу:
if (obj is String) {
print(obj.length)
}
if (obj !is String) { // same as !(obj is String)
print("Not a String")
} else {
print(obj.length)
}
Умные приведения типов
В большинстве случаев вам не нужно использовать явные операторы приведения типов в Kotlin, потому что компилятор отслеживает проверки is и явные приведения типов для неизменяемых значений и вставляет (безопасные) приведения автоматически, когда это необходимо:
fun demo(x: Any) {
if (x is String) {
print(x.length) // x is automatically cast to String
}
}
Компилятор достаточно умен, чтобы понимать, что приведение типов безопасно, если отрицательная проверка приводит к возврату:
if (x !is String) return print(x.length) // x is automatically cast to String
или если оно находится в правой части && или ||, а соответствующая проверка (обычная или отрицательная) находится в левой части:
// x is automatically cast to String on the right-hand side of `||`
if (x !is String || x.length == 0) return
// x is automatically cast to String on the right-hand side of `&&`
if (x is String && x.length > 0) {
print(x.length) // x is automatically cast to String
}
Умные приведения типов работают и с when выражениями и while циклами:
when (x) {
is Int -> print(x + 1)
is String -> print(x.length + 1)
is IntArray -> print(x.sum())
}
Обратите внимание, что умные приведения типов работают только тогда, когда компилятор может гарантировать, что переменная не изменится между проверкой и использованием. Более конкретно, умные приведения типов могут быть использованы в следующих условиях:
valлокальные переменные — всегда, за исключением делегированных локальных свойств.valсвойства — если свойство является частным или внутренним, или если проверка выполняется в том же модуле, где объявлено свойство. Умные приведения типов не могут использоваться для открытых свойств или свойств, имеющих пользовательские геттеры.varлокальные переменные — если переменная не изменяется между проверкой и использованием, не захватывается в лямбда-выражение, которое изменяет её, и не является локальным делегированным свойством.varсвойства — никогда, так как переменная может быть изменена в любое время другим кодом.
Оператор «небезопасного» приведения типов
Обычно оператор приведения типов выбрасывает исключение, если приведение невозможно. Поэтому он называется небезопасным. Небезопасное приведение типов в Kotlin выполняется с помощью инфиксного оператора as.
val x: String = y as String
Обратите внимание, что null не может быть приведено к типу String, так как этот тип не nullable. Если y равно null, приведенный выше код выбросит исключение. Чтобы сделать такой код корректным для значений null, используйте nullable тип в правой части приведения:
val x: String? = y as String?
Оператор «безопасного» (nullable) приведения типов
Чтобы избежать исключений, используйте оператор безопасного приведения типов as?, который возвращает null при неудаче.
val x: String? = y as? String
Обратите внимание, что, несмотря на то, что правая часть as? является типом без null String, результат приведения типов является nullable.
Проверки и приведения типов дженериков
Для получения информации о типах проверок и приведений, которые можно выполнять с дженериками, обратитесь к соответствующему разделу на странице документации по дженерикам.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/typecasts.html