Null Safety Patterns
Smart Casts
Check a value's type and then use it without a manual cast.
smart-cast
After an `is` check, Kotlin can smart-cast the value inside that branch.
Smart Casts
SmartCasts.kt
Replay: real traced execution (multi-file project)
fun main() {
val value: Any? = "book"
val result: String
if (value is String) {
result = "string:${value.length}"
} else if (value is Int) {
result = "int:${value + 1}"
} else {
result = "missing"
}
println("result=$result")
}
fun main() {
val value: Any? = 42
val result: String
if (value is String) {
result = "string:${value.length}"
} else if (value is Int) {
result = "int:${value + 1}"
} else {
result = "missing"
}
println("result=$result")
}
fun main() {
val value: Any? = null
val result: String
if (value is String) {
result = "string:${value.length}"
} else if (value is Int) {
result = "int:${value + 1}"
} else {
result = "missing"
}
println("result=$result")
}
value ← book
1fun main() {2 val value→ book: Any? = "book" //@value=42, null3 val result: Stringresult ← string:4
5if (valuebook is String) {6 result→ string:4 = "string:${value.length4}"7} else if (value is Int) {println("result=$result")
13 println("result=$resultstring:4")14}outputresult=string:4
value ← 42
1fun main() {2 val value→ 42: Any? = 423 val result: Stringresult ← int:43
6 result = "string:${value.length}"7} else if (value42 is Int) {8 result→ int:43 = "int:${value42 + 1}"9} else {println("result=$result")
13 println("result=$resultint:43")14}outputresult=int:43
value ← null
1fun main() {2 val value→ null: Any? = null3 val result: Stringresult ← missing
8 result = "int:${value + 1}"9} else {10 result→ missing = "missing"11}println("result=$result")
13 println("result=$resultmissing")14}outputresult=missing