Conversion de classe

           

Observez tout d'abord le programme ci-dessous. La classe Chien étend la classe Animal. Par le fait que la classe Chien étend la classe Animal, tout objet de la classe Chien est aussi une instance de la classe Animal mais le contraire n'est pas vrai. Néanmoins, si un objet référencé par une référence d'Animal est en fait un Chien, on peut avoir accès aux champs spécifique de la classe Chien ; cela nécessite une conversion de classe, encore appelé transtypage.
À l'exécution, si on applique une conversion de classe qui se trouve être illégitime (voir l'exemple ci-dessous), une exception de type java.lang.ClassCastException est lancée.


class Animal {
}

class Chien extends Animal {
int taille = 80;
}

class Conversion {
public static void main(String argv[]) {
Animal animal;
Chien chien = new Chien();
animal = chien;
chien = (Chien)animal; //conversion de classe
System.out.println("un chien mesure : " + chien.taille + " cm");
animal = new Animal();
chien = (Chien)animal; //conversion de classe
}
}
A l'exécution on obtient :
un chien mesure : 80 cm
Exception in thread "main" java.lang.ClassCastException: Animal cannot be cast to Chien
at Conversion.main(Conversion.java:19)
La conversion de classe s'obtient donc en mettant le nom de la classe vers laquelle on veut faire la conversion entre des parenthèses. Si on a la déclaration :
    A a;
et plus loin (B)a, le compilateur accepte cette conversion s'il y a une filiation entre A et B, que B hérite de A ou que A hérite de B. À l'exécution, la machine virtuelle vérifie que l'objet référencé par a est bien de type B (c'est-à-dire de la classe B ou d'une classe qui hérite de B) ; si ce n'est pas le cas, elle envoie une ClassCastException.

Le fichier Conversion.java contenant l'exemple ci-dessus.

© Irène Charon Télécom ParisTech 2012