Smart Cast

Definição

O compilador faz o cast automático de uma variável após a verificação de um determinado tipo. Sendo assim, não é preciso fazer o cast explícito, como no Java:

// Java
if (object instanceof Person) {
  Person person = (Person) object;
}
// Kotlin
if (object is Person) {
  val person: Person = object
}

A Verificação de tipos é feito a partir da palavra reservada is (equivalente ao instanceof do Java).

A palavra reservada as serve para realizar a atribuição de um tipo para outro (muitas das vezes um “cast forçado”).

Exemplo

Smart Cast:

interface Expressao
 
class Numero(val valor: Int) : Expressao
 
class Soma(val equerdo: Expressao, val direito: Expressao): Expressao
 
fun avaliacao(expressao: Expressao): Int {
    if (expressao is Numero) {
        return expressao.valor
    }
 
    if (expressao is Soma) {
        return avaliacao(expressao.equerdo) + avaliacao(expressao.direito)
    }
 
    throw IllegalArgumentException("Expressão é desconhecida")
}
 
fun main() {
    // ((1 + 2) + 4)
    val avaliacao = avaliacao(
        Soma(
            Soma(Numero(1), Numero(2)),
            Numero(4)
        )
    )
    println(avaliacao)
}

Cast explícito:

if (valor is Int) {
  val numeroInteiro = valor as Int // Desnecessário
}