Menu

Conversion de types en Java : élargissement, rétrécissement et conversions

Comment Java convertit entre les types : élargissement automatique, conversions de rétrécissement explicites, quelles données vous perdez en rétrécissant, et conversion entre nombres et chaînes.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Ce que signifie la conversion de types

Java est à typage statique : chaque valeur a un type, et le compilateur ne vous laissera pas mélanger silencieusement des types incompatibles. La conversion de types est la manière de convertir une valeur d'un type vers un autre — parfois Java le fait pour vous, et parfois vous devez le demander explicitement.

Il y a deux directions. Passer d'un type plus petit à un type plus grand (un int vers un double) est sûr et se produit automatiquement. Passer d'un type plus grand à un type plus petit (un double vers un int) peut perdre des données, donc Java vous oblige à l'indiquer avec une conversion.

Élargissement : la conversion automatique

Une conversion d'élargissement déplace une valeur vers un type ayant plus de place. Rien ne peut être perdu, donc Java le fait pour vous sans conversion :

L'int 7 se glisse dans un double et devient 7.0. L'ordre d'élargissement pour les nombres est byte -> short -> int -> long -> float -> double ; affecter de la gauche vers la droite le long de cette chaîne ne nécessite jamais de conversion. C'est pourquoi mélanger des types dans une opération arithmétique « fonctionne souvent tout seul » — Java élargit d'abord l'opérande le plus petit.

Rétrécissement : la conversion explicite

Dans l'autre sens — une conversion de rétrécissement — des données peuvent être perdues, donc le compilateur refuse à moins que vous ne placiez le type cible entre parenthèses devant la valeur :

(int) pi est la conversion. Notez ce qu'elle fait : elle tronque vers zéro, en supprimant simplement la partie décimale. 3.9 devient 3, et -3.9 devient -3. Elle n'arrondit pas. Si vous voulez arrondir, c'est un outil différent :

Oublier qu'une conversion tronque est l'un des bugs les plus fréquents chez les débutants — si votre nombre « arrondi » est toujours trop petit d'une unité, c'est généralement la raison.

Le piège de la division entière

Ce piège attrape tout le monde une fois. Lorsque les deux opérandes sont des int, l'opérateur / effectue une division entière et jette le reste — avant toute affectation à un double :

a / b est 7 / 2, calculé entièrement en arithmétique int, ce qui donne 3. Élargir vers double ensuite ne fait que transformer 3 en 3.0 — le .5 est déjà perdu. Convertir un opérande en double d'abord ((double) a / b) force toute l'expression en virgule flottante, donnant le 3.5 que vous vouliez. Vous n'avez besoin de convertir qu'un seul côté ; Java élargit l'autre pour correspondre.

Quand le rétrécissement dépasse la capacité

Une conversion ne vérifie pas si la valeur tient. Si elle ne tient pas, les bits sont simplement tronqués et vous obtenez un résultat surprenant — aucune erreur, aucun avertissement :

300 ne tient pas dans un byte, donc les bits de poids fort sont supprimés et vous obtenez 44. C'est une perte de données « silencieuse » — le programme s'exécute sans problème et donne une mauvaise réponse. Ne rétrécissez que lorsque vous êtes sûr que la valeur tient dans le type plus petit.

Convertir entre nombres et chaînes

Une String est un objet, pas un nombre, donc vous ne pouvez pas la convertir avec (int) — c'est une erreur de compilation. La conversion utilise plutôt des méthodes dédiées :

Pour passer du texte à un nombre, on utilise Integer.parseInt / Double.parseDouble. Si la chaîne n'est pas un nombre valide (disons "hello"), ces méthodes lèvent une NumberFormatException. Pour passer d'un nombre au texte, utilisez String.valueOf(n) ou concaténez simplement avec "" — car n + "" force l'int à devenir une String. Attention à la différence entre "5" + 1 (qui donne la chaîne "51") et 5 + 1 (qui donne 6) ; le + signifie concaténation dès qu'une String est impliquée.

Convertir des objets

La conversion s'applique aussi aux références d'objets, pas seulement aux primitifs. Vous pouvez convertir une référence vers un type apparenté le long d'une chaîne d'héritage — l'élargissement vers un type parent est automatique, le rétrécissement en sens inverse nécessite une conversion explicite et n'est sûr que si l'objet est réellement de ce type :

Object o = "hello";
String s = (String) o;        // OK : o référence réellement une String
Integer bad = (Integer) o;    // compile, mais lève une ClassCastException à l'exécution

La seconde conversion compile mais explose à l'exécution avec une ClassCastException car l'objet est une String, pas un Integer. Vous rencontrerez cela en détail une fois arrivé à l'héritage et au polymorphisme ; pour l'instant, sachez simplement que la syntaxe (Type) est la même idée appliquée aux objets.

Suivant : if-else

La conversion vous permet de remodeler des valeurs ; l'étape suivante consiste à faire en sorte que votre programme choisisse entre des chemins en fonction de ces valeurs. L'instruction if-else exécute un bloc lorsqu'une condition est vraie et un autre lorsqu'elle est fausse — le fondement de chaque décision que prend votre code. C'est la page suivante.

Questions fréquentes

Qu'est-ce que la conversion de types en Java ?

La conversion de types consiste à transformer une valeur d'un type de données en un autre. Java effectue automatiquement les petites conversions « d'élargissement » (comme de int vers double), mais une conversion de « rétrécissement » susceptible de perdre des données (comme de double vers int) exige une conversion explicite : int n = (int) 3.9;.

Comment convertir un double en int en Java ?

Placez le type cible entre parenthèses devant la valeur : int n = (int) 3.9;. Cela tronque vers zéro (supprime la partie décimale), donc vous obtenez 3, pas 4. Pour arrondir à la place, utilisez Math.round(3.9), qui renvoie 4.

Comment convertir une String en int en Java ?

Une String n'est pas un nombre, vous ne pouvez donc pas la convertir avec (int). Utilisez Integer.parseInt("42") pour obtenir un int, ou Double.parseDouble("3.14") pour un double. Si le texte n'est pas un nombre valide, ces méthodes lèvent une NumberFormatException.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER