Kotlin Smart cast — проверка типов

В руководстве Kotlin Nullable Types and Non-Nullable Types мы могли понять, как объявляется нулевой тип. Чтобы использовать эти типы, допускающие значение NULL, у нас есть возможность проверить и использовать Smart cast в Kotlin.

Это функция, в которой компилятор Котлин отслеживает условия внутри выражения if. Если компилятор обнаружит, что переменная не является нулевой или может иметь значение null в Kotlin, тогда компилятор разрешит доступ к этой переменной.

Пример

Когда мы пытаемся получить доступ к типу String, допускающему значение NULL, без safe cast, это вызовет ошибку компиляции.

 
var string: String? = "Hello!" 
    print(string.length) // Compile error 

Чтобы решить приведенное выше выражение, мы используем такое safe cast как:

 
fun main(args: Array){ 
var string: String? = "Hello!" 
    if(string != null) { // smart cast 
print(string.length) // It works now! 
    } 
} 

Выход:

6 

При использовании is или !is для проверки переменной компилятор отслеживает эту информацию и внутренне приводит переменную к целевому типу. Это делается внутри области видимости, если is или !is возвращает true.

Использование is для Smart cast

 
fun main(args: Array){ 
val obj: Any = "The variable obj is automatically cast to a String in this scope" 
    if(obj is String) { 
                // No Explicit Casting needed. 
println("String length is ${obj.length}") 
    } 
} 

Выход:

String length is 64 

Использование !is

 
fun main(args: Array){ 
val obj: Any = "The variable obj is automatically cast to a String in this scope" 
    if(obj !is String) { 
println("obj is not string") 
 
    } else 
    // No Explicit Casting needed. 
println("String length is ${obj.length}") 
} 

Выход:

String length is 64 

Smart cast работает в соответствии со следующими условиями:

    • Переменная val всегда связана с локальными свойствами.
    • Если свойство val является закрытым или внутренним, проверка выполняется в том же модуле, где свойство объявлено.
    • Если локальная переменная var не изменяется между проверкой и использованием, она не фиксируется в лямбде, которая ее изменяет.
Оцените статью