next up previous contents index
Next: 13 Classes imbriquées Up: Java: Le langage Previous: 11 Tableaux et chaînes

Subsections

12 Conversions et promotions

       

 

A revoir et compléter

Nous avons dit (4.1.3) que toute expression possède un type. Ce type peut être déduit en examinant les constantes, les variables et les méthodes qui figurent dans une expression. On peut être amené à écrire des expressions dont le type n'est pas correct. Parmi ces expressions ``incorrectes'', certaines sont des vraies erreurs et le compilateurs se charge de le signaler par un message d'erreur à la compilation. Mais il en existe d'autre pour lesquelles Java décide d'effectuer automatiquement les conversions nécessaires (quand cela est possible) pour rendre l'expression correcte.

Il existe plusieurs types de conversions  :

12.1 Type de conversion

12.1.1 Conversion vers le même type

La conversion d'un type en lui même est permise. Ceci peut sembler trivial voir inutile mais cela permet d'autoriser les opérations de changement de type (cast) redondantes.

La seule conversion permise pour le type boolean est la conversion vers le type boolean lui-même.

12.1.2 Conversion vers un type primitif plus grand

Il existe 19 conversions possibles dans cette catégorie :

La conversion d'un int ou long vers un float ou double peut conduire à une perte d'information. La value approchée résultat est obtenu choisissant le flottant le plus de l'entier (IEEE 754 round-to-nearest ).

Quant aux conversions des entiers (plus petit en taille) vers un autre entier (plus grand en taille) se fait évidemment sans perte de précision et en complétant les bits de poids fort à 0.

Toutes ces conversions ne produisent jamais d'exception lors de l'exécution.

12.1.3 Conversion vers un type primitif plus petit

Il existe 23 conversions possibles dans cette catégorie :

Ces conversions peuvent évidemment conduire à des pertes d'informations. Les conversions des entiers (plus grand en taille) vers un autre entier (plus petit en taille) se fait en supprimant les bits de poids fort.

 

Conversions
des flottants
vers des entiers

12.1.4 Conversion vers un objet plus grand

Toutes ces conversions ne produisent jamais d'exception lors de l'exécution.

12.1.5 Conversion vers un objet plus petit

Toutes ces conversions effectue des test à l'exécution et peuvent produire l'exception ClassCastException lors de l'exécution.

12.1.6 Conversion de chaînes

IL y a une conversion d'un type quelconque (même le type null) en type String.

12.1.7 Conversion interdites

Il n'est pas permis de convertir

12.2 Affectation

Lors d'une affectation, le type de l'opérande droit est converti en le type de l'opérande gauche.  

Array Store Exception

L'affectation

 

byte x = 5;
est valide car la constante 5 (qui est de type int) est converti automatiquement en byte. Il n'est pas nécessaire d'écrire
 

byte x = (byte)5;

Lorsque la conversion requise pour une affectation est interdite alors une erreur de compilation est générée.

12.3 Invocation de méthodes

Lors de l'invocation d'une méthode, les paramètres effectifs de la méthode sont convertis en accord avec le type des paramètres formels.

Contrairement à l'affectation, la conversion vers un type plus restreint n'est pas effectuée et ce pour simplifier la surcharge des méthodes :

 

class Test {
    static int m(byte a, int b) { return a+b; }
    static int m(short a, short b) { return a-b; }
    public static void main(String[] args) {
        System.out.println(m(12, 2));            // Erreur de compilation
        }
}

12.4 Chaînes de caractères

La conversion de chaînes de caractères ne concerne que l'opérateur de concaténation ``+''.

N'importe quel type peut être converti en String. Pour être converti en un objet de type String, une valeur d'un type primitif est tout d'abord converti en un objet de son type (par exemple, un float en un objet de type Float). Ainsi, on se ramène au cas général de la conversion d'un objet d'un classe en un objet de type String qui utilise la méthode toString.

12.5 Changement de type

Le changement de type s'obtient en appliquant explicitement l'opération de cast . Par cette opération, il est permis d'effectuer n'importe quel opération de conversion permise.

Certaines conversions non permises peuvent être détectées à la compilation et auquel cas, une erreur de compilation est générée.

 

détailler
voir spec

12.6 Promotion numérique

Dans le contexte d'opération arithmétiques, les conversions automatiques effectuées sont appelées promotions numériques.

12.6.1 Opérations unaires

La promotion numérique sont effectuées dans les cas suivants:


next up previous contents index
Next: 13 Classes imbriquées Up: Java: Le langage Previous: 11 Tableaux et chaînes
Touraivane
6/12/1998