Les conversions de type
Qu’est-ce que la conversion de type ?
La conversion de type, également appelée transtypage ou encore cast, consiste à convertir un élément d’un certain type vers un autre type.
Prenons l’exemple d’une fonction dans un programme qui retourne un résultat de type Any. Dans un cas d’utilisation précis, nous savons que le retour est en réalité une chaîne de caractères. La conversion de type consistera alors à convertir une variable de type Any en un type String.
Prenons un autre exemple. Un programme, dans lequel la notion d’héritage est utilisée, expose des classes modélisant des chiens et des chats. Chacune de ces classes est une classe fille d’une classe modélisant un animal de manière plus globale. Toujours dans ce programme, une variable stocke des animaux dans une liste. Ces animaux peuvent être des chats ou des chiens. Dans un cas précis d’utilisation, nous savons qu’en réalité chaque animal contenu dans la liste est un chien. La conversion de type consistera alors à convertir une variable de type animal en un type chien.
Mettre en place la conversion de type
De manière générale, convertir une variable d’un type vers un autre est extrêmement simple puisqu’il convient d’utiliser le mot-clé as. À gauche de ce mot-clé, on renseigne la valeur ou la variable à convertir tandis qu’à droite, on précise le type cible de la conversion.
Reprenons l’exemple de la fonction dont la signature indique un retour de type Any alors que dans la pratique celle-ci retourne une chaîne de caractères :
fun main()
{
val result = theFunction()
}
fun theFunction(): Any =
"Hello"
Dans ce programme, la variable result est de type Any. Par conséquent, nous ne pouvons pas utiliser les fonctions spécifiques au type String, par exemple toUpperCase qui met la chaîne de caractères en majuscules.
Convertissons la variable result afin de récupérer, dans une nouvelle variable, une chaîne de caractères sur laquelle il sera possible d’appeler la méthode toUpperCase. Comme indiqué, utilisons le mot-clé as avec la syntaxe décrite. Le programme évolue alors de la manière suivante :
fun main()
{
val result = theFunction()
val castedResult = result as String
...
La conversion de type intelligente
Il est possible de faire des conversions de type sans utiliser les mots-clés as? et as. C’est ce qu’on appelle la conversion de type intelligente ou smart cast en anglais.
Pour ce faire, c’est extrêmement simple puisque l’essentiel du travail est réalisé par le langage Kotlin lui-même.
Il suffit de vérifier, à l’aide d’une condition, si la variable que l’on souhaite convertir est du type cible. Si c’est le cas, la condition sera vraie et l’on pourra, dans la portée de la condition, utiliser la variable comme une variable du type cible.
Pour rappel, on vérifie le type d’une variable à l’aide du mot-clé is.
Revenons à la fonction dont la signature indique un retour de type Any alors que, dans la pratique, celle-ci retourne une chaîne de caractères. Comme précédemment, on utilise la fonction toUpperCase sauf que cette fois il opère une conversion de type intelligente :
fun main()
{
val result = theFunction()
if(result is String)
{
println(result.toUpperCase())
}
}
fun theFunction(): Any =
"Hello"
Cette syntaxe est très pratique et c’est une garantie de sécurité : la conversion...
En résumé
-
Conversion de type, transtypage et cast désignent le même concept.
-
La conversion de type consiste à convertir un élément d’un type A en un élément d’un type B.
-
La conversion de type non sécurisée est possible grâce au mot-clé as.
-
La conversion de type sécurisée est possible grâce au mot-clé as?.
-
La conversion de type intelligente permet de convertir automatiquement une variable dans le type cible après vérification de son type.