Qu'est-ce que reified en Kotlin et pourquoi cette « magie » ?
\nSi vous avez déjà programmé en Java, vous avez sûrement rencontré le Type Erasure — l'effacement des types lors de l'exécution. En Java (et en Kotlin par défaut), l'information sur le type à l'intérieur des génériques n'est disponible qu'à la compilation, et disparaît à l'exécution. Cela signifie que vous ne pouvez pas écrire if (value is T) ou T::class à l'intérieur d'une fonction ordinaire, car T pendant l'exécution n'est qu'un Object.
Mais Kotlin est allé plus loin. Le mot-clé reified (de l'anglais « réifié ») permet de « faire revivre » le type à l'intérieur d'une fonction inline. Grâce à reified, vous pouvez faire ce qui semblait impossible en Java : vérifier le type, obtenir un KClass, créer des instances et même travailler avec la réflexion — et tout cela à l'exécution.
Dans cet article, nous allons voir comment fonctionne reified, avec des exemples concrets que vous pourrez appliquer immédiatement. C'est parti !
\n\nLe problème : Type Erasure en action
\nImaginez : vous écrivez une fonction qui doit vérifier si un objet est une chaîne de caractères. Une tentative naïve :
\nfun <T> isString(value: Any): Boolean {\n return value is T // Erreur de compilation !\n}\nLe compilateur affichera une erreur : "Cannot check for instance of erased type: T". Pourquoi ? Parce que lors de l'exécution, la JVM ne sait pas ce qu'est T. Pour elle, T n'est qu'un Object.
La même chose avec l'obtention de la classe : T::class à l'intérieur d'une fonction ordinaire ne fonctionnera pas non plus. C'est ce qu'on appelle le Type Erasure — le principal casse-tête des développeurs Java.
La solution : reified + inline
\nKotlin propose une solution élégante. Pour « mémoriser » le type à l'exécution, il faut rendre la fonction inline et marquer le paramètre de type avec le mot-clé reified :
\ninline fun <reified T> isString(value: Any): Boolean {\n return value is T // Maintenant ça marche !\n}\nOn peut maintenant appeler :
\nprintln(isString<String>("Hello")) // true\nprintln(isString<Int>("Hello")) // false\nComment ça marche ? Lorsque vous marquez une fonction comme inline, le compilateur intègre son code directement à l'endroit de l'appel. Et reified force le compilateur à substituer le type concret (par exemple, String) à la place de T dans le code généré. En conséquence, une vérification explicite value is String apparaît dans le bytecode.
Exemples pratiques d'utilisation de reified
\nRegardons quelques scénarios réels où reified simplifie vraiment la vie.
\n\n1. Obtenir la classe à l'exécution
\nL'une des tâches les plus courantes est d'obtenir un KClass ou un Class à partir du paramètre de type. Sans reified, c'est impossible :
inline fun <reified T> getKClass(): KClass<T> = T::class\n\n// Utilisation :\nval kClass = getKClass<String>()\nprintln(kClass.simpleName) // String\nC'est particulièrement utile lorsqu'on travaille avec des bibliothèques nécessitant de la réflexion (par exemple, sérialisation, ORM, conteneurs DI).
\n\n2. Créer une instance par type
\nVous voulez créer un objet du type souhaité sans passer de constructeur ? Facile :
\ninline fun <reified T : Any> createInstance(): T {\n return T::class.createInstance()\n}\n\n// Exemple :\nval instance = createInstance<StringBuilder>()\ninstance.append("Hello, reified!")\nMais attention : createInstance() fonctionne uniquement si la classe a un constructeur sans paramètres. Sinon, vous obtiendrez une exception.
3. Filtrer par type dans les collections
\nSupposons que vous ayez une liste d'objets de différents types et que vous souhaitiez filtrer uniquement les chaînes de caractères. La bibliothèque standard de Kotlin propose filterIsInstance<T>(), mais vous pouvez facilement écrire votre propre version :
Blogs
Book Recommendations
Lire aussi
OAuth 2.0 et autorisation JWT en PHP : guide complet pour débutants
Tests en PHP : Unit, Integration, E2E — guide complet
Tests E2E d'applications C++ : de la théorie au CI/CD opérationnel
TypeScript de zéro à PRO : les meilleures chaînes YouTube et cours en 2024
Optimisation des performances des applications C# : guide pour débutants