«instanceof» em Kotlin: verificação de tipo com is e when (guia)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

«instanceof» em Kotlin: por que não é Java, e como isso torna o código mais limpo

\n\n

Se você veio para Kotlin do mundo Java, provavelmente está acostumado com a palavra-chave instanceof. Ela ajuda a saber se um objeto é uma instância de uma determinada classe. Mas em Kotlin esse operador não existe. E isso não é um bug, é uma funcionalidade.

\n\n

Kotlin oferece uma maneira muito mais elegante, segura e concisa de verificar o tipo de um objeto — o operador is. Ele não apenas responde à pergunta "quem é você?", mas também converte automaticamente o objeto para o tipo necessário. Isso é chamado de smart cast (conversão inteligente), e é um dos recursos que tornam o código em Kotlin tão agradável.

\n\n

Neste guia, abordaremos:

\n
    \n
  • Como usar o operador is em vez de instanceof;
  • \n
  • O que é smart cast e como funciona;
  • \n
  • Como lidar elegantemente com vários tipos usando when;
  • \n
  • Qual a diferença entre a conversão segura as? e a conversão comum as;
  • \n
  • E, claro, exemplos reais de código.
  • \n
\n\n

Vamos lá!

\n\n

1. Operador is — o análogo direto do instanceof

\n\n

Em Java, você escreveria:

\n
if (obj instanceof String) {\n    String str = (String) obj;\n    System.out.println(str.length());\n}
\n\n

Em Kotlin, a mesma coisa fica assim:

\n
if (obj is String) {\n    println(obj.length) // Smart cast! obj já é String\n}
\n\n

Observe: após a verificação obj is String, você não precisa converter explicitamente obj para o tipo String. O compilador Kotlin sabe que, dentro do bloco if, a variável obj é garantidamente uma string. Isso é o smart cast (conversão inteligente).

\n\n

Como funciona internamente?

\n

O compilador analisa o fluxo de execução. Se ele vê uma verificação is e não encontra a possibilidade de o tipo da variável mudar entre a verificação e o uso (por exemplo, em código multithread ou ao alterar var), ele converte o tipo automaticamente. Para val, isso funciona sempre; para var, funciona apenas se a variável não puder ser alterada entre a verificação e o uso.

\n\n

2. Negação: !is

\n\n

Quer verificar se o objeto não é de um tipo? Use !is:

\n
if (obj !is String) {\n    println("Isso não é uma string")\n} else {\n    // Aqui obj automaticamente se torna String\n    println("Tamanho da string: ${obj.length}")\n}
\n\n

Conveniente e legível, não é?

\n\n

3. Múltiplas verificações com when

\n\n

Agora imagine que você tem um objeto que pode ser um de vários tipos. Em Java, você escreveria uma cadeia de if-else if com instanceof. Em Kotlin, existe uma ferramenta mais elegante — a construção when.

\n\n
fun describe(obj: Any): String {\n    return when (obj) {\n        is String -> "String de tamanho ${obj.length}"\n        is Int -> "Número inteiro: $obj"\n        is List<*> -> "Lista com ${obj.size} elementos"\n        is Map<*, *> -> "Mapa com ${obj.size} entradas"\n        else -> "Tipo desconhecido"\n    }\n}\n\nfun main() {\n    println(describe("Olá"))   // String de tamanho 4\n    println(describe(42))         // Número inteiro: 42\n    println(describe(listOf(1,2)))// Lista com 2 elementos\n}
\n\n

Observe: dentro de cada ramo do when, o smart cast também funciona! No ramo is String, a variável obj já é considerada uma string, e você pode chamar obj.length sem conversão adicional.

\n\n

Isso é muito mais compacto e seguro do que o clássico switch ou uma cadeia de if.

\n\n

4. Conversão segura: as?

\n\n

Às vezes, você não precisa apenas verificar o tipo, mas obter imediatamente o valor de um tipo específico. Em Java, você faria (String) obj

Blogs

Book Recommendations