Spec-Zone.ru › Kotlin 1.8

Проверка типов и приведение типов

Операторы 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.

Проверка и приведение типов для дженериков

Пожалуйста, обратитесь к соответствующему разделу на странице документации по дженерикам generics documentation page для получения информации о том, какие проверки и приведения типов вы можете выполнить с дженериками.

Последнее изменение: 10 января 2023
Целочисленные типы без знака Условные операторы и циклы

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API