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

value
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")
}
  1. value ← book

    1fun main() {2    val value→ book: Any? = "book" //@value=42, null3    val result: String
  2. result ← string:4

    5if (valuebook is String) {6    result→ string:4 = "string:${value.length4}"7} else if (value is Int) {
  3. println("result=$result")

    13    println("result=$resultstring:4")14}
    outputresult=string:4
  1. value ← 42

    1fun main() {2    val value→ 42: Any? = 423    val result: String
  2. result ← int:43

    6    result = "string:${value.length}"7} else if (value42 is Int) {8    result→ int:43 = "int:${value42 + 1}"9} else {
  3. println("result=$result")

    13    println("result=$resultint:43")14}
    outputresult=int:43
  1. value ← null

    1fun main() {2    val value→ null: Any? = null3    val result: String
  2. result ← missing

    8    result = "int:${value + 1}"9} else {10    result→ missing = "missing"11}
  3. println("result=$result")

    13    println("result=$resultmissing")14}
    outputresult=missing