В руководстве 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 не изменяется между проверкой и использованием, она не фиксируется в лямбде, которая ее изменяет.
