N. f. (On dit aussi transtypage, conversion de type, forçage ou, moins bien, cast (surtout en C++ et Java)) En programmation, conversion d'une valeur d'un type dans un autre type.
Exemples : convertir un entier en nombre à virgule flottante, un entier en chaine de caractère, un pointeur en entier, une chaine en entier,...
On peut en théorie considérer 4 sortes de coercition qu'on définira succintement ci-dessous. Il est essentiel pour le développeur de bien connaître ce que permet le langage qu'il utilise dans ce domaine.
- Coercition par réinterprétation d'une zone mémoire
C'est une fonctionnalité de bas niveau (disponible en C et C++) qui consiste à ne pas transformer la valeur qui est en mémoire mais à la réinterpréter (éventuellement après l'avoir copiée). C'est ce que l'on fait quand on convertit un pointeur en entier ou quand on transforme un objet en tableau.
Ce type de coercition se rencontre rarement dans nos langages évolués, heureusement, car elle est difficile à maîtriser puisqu'elle demande de savoir avec précision comment sont stockées 'en binaire) les données en mémoire.
- Coercition entre types incomparables
C'est la coercition la plus fréquente, celle que nous utilisons couramment en développement. Elle consiste à copier et transformer la valeur de la donnée afin de l'adapter à un nouveau type. On transforme par exemple la chaine « 5 » (stockée avec la valeur ASCII du caractère 5 en un octet) en un entier de valeur 5 (probablement stocké en complément à deux sur 4 octets), l'entier 17 en un flottant de valeur 17.0 (utilisant IEEE 754).
Certains langages, faiblement typés, opèrent ces coercitions implicitement (ce qui n'est pas sans danger). PHP par exemple, sommé d'additionner « 2 poires » et « 6 pommes » n'hésite pas à convertir la chaine « 2 poires » en l'entier 2 (l'interpréteur cherche les chiffres en partant de la gauche) et la chaine « 6 pommes » en l'entier 6 !
echo " 2 poires" + " 6 pommes";
8
Coercition ascendante
Cette sorte de coercition ne se rencontre qu'en programmation objet quand le type source est un sous-type du type cible. Il consiste à prendre une instance d'une sous-classe pour une instance de la super-classe.
Coercition descendante
C'est l'inverse de la coercition ascendante, le type source est un un super-type du type cible et la coercition consiste à vérifier le sous-typage.
On se référera, pour plus de précisions, au texte du Professeur Ducourneau cité ci-dessous.