«instanceof» en Kotlin : vérification de type avec is et when (guide)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

«instanceof» en Kotlin : pourquoi ce n'est pas Java, et comment cela rend le code plus propre

\n\n

Si vous venez de Java vers Kotlin, vous êtes probablement habitué au mot-clé instanceof. Il permet de savoir si un objet est une instance d'une classe particulière. Mais en Kotlin, cet opérateur n'existe pas. Et ce n'est pas un bug, c'est une fonctionnalité.

\n\n

Kotlin propose une manière bien plus élégante, sûre et concise de vérifier le type d'un objet — l'opérateur is. Non seulement il répond à la question « qui es-tu ? », mais il convertit aussi automatiquement l'objet vers le type souhaité. C'est ce qu'on appelle le smart cast (cast intelligent), et c'est l'une de ces fonctionnalités qui rendent le code Kotlin si agréable.

\n\n

Dans ce guide, nous aborderons :

\n
    \n
  • Comment utiliser l'opérateur is à la place de instanceof ;
  • \n
  • Ce qu'est le smart cast et comment il fonctionne ;
  • \n
  • Comment traiter élégamment plusieurs types avec when ;
  • \n
  • En quoi le cast sécurisé as? diffère du cast normal as ;
  • \n
  • Et, bien sûr, des exemples de code concrets.
  • \n
\n\n

C'est parti !

\n\n

1. L'opérateur is — l'équivalent direct de instanceof

\n\n

En Java, vous écririez :

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

En Kotlin, la même chose ressemble à ceci :

\n
if (obj is String) {\n    println(obj.length) // Smart cast ! obj est déjà un String\n}
\n\n

Remarquez : après la vérification obj is String, vous n'avez pas besoin de convertir explicitement obj en type String. Le compilateur Kotlin sait qu'à l'intérieur du bloc if, la variable obj est garantie d'être une chaîne de caractères. C'est ce qu'on appelle le smart cast (cast intelligent).

\n\n

Comment cela fonctionne sous le capot ?

\n

Le compilateur analyse le flux d'exécution. S'il voit une vérification is et ne trouve aucune possibilité de changer le type de la variable entre la vérification et l'utilisation (par exemple, dans du code multithread ou lors de la modification d'une var), il convertit automatiquement le type. Pour val, cela fonctionne toujours ; pour var, uniquement si la variable ne peut pas être modifiée entre la vérification et l'utilisation.

\n\n

2. Négation : !is

\n\n

Vous voulez vérifier qu'un objet n'est pas d'un certain type ? Utilisez !is :

\n
if (obj !is String) {\n    println("Ce n'est pas une chaîne")\n} else {\n    // Ici, obj est automatiquement devenu un String\n    println("Longueur de la chaîne : ${obj.length}")\n}
\n\n

Pratique et lisible, n'est-ce pas ?

\n\n

3. Vérifications multiples avec when

\n\n

Imaginez maintenant que vous ayez un objet qui peut être de plusieurs types différents. En Java, vous écririez une chaîne de if-else if avec instanceof. En Kotlin, il existe un outil plus élégant — la construction when.

\n\n
fun describe(obj: Any): String {\n    return when (obj) {\n        is String -> "Chaîne de longueur ${obj.length}"\n        is Int -> "Nombre entier : $obj"\n        is List<*> -> "Liste de ${obj.size} éléments"\n        is Map<*, *> -> "Map avec ${obj.size} entrées"\n        else -> "Type inconnu"\n    }\n}\n\nfun main() {\n    println(describe("Bonjour"))   // Chaîne de longueur 7\n    println(describe(42))         // Nombre entier : 42\n    println(describe(listOf(1,2)))// Liste de 2 éléments\n}
\n\n

Remarquez : à l'intérieur de chaque branche de when, le smart cast fonctionne également ! Dans la branche is String, la variable obj est déjà considérée comme une chaîne, et vous pouvez appeler obj.length sans conversion supplémentaire.

\n\n

C'est beaucoup plus compact et plus sûr qu'un switch classique ou une chaîne de if.

\n\n

4. Cast sécurisé : as?

\n\n

Parfois, vous n'avez pas seulement besoin de vérifier le type, mais d'obtenir immédiatement une valeur d'un type spécifique. En Java, vous feriez (String) obj

Blogs

Book Recommendations