Salut,
Quand tu écris b=(B)a;, tu dis "j'ai une variable (a) qui pointe que une instance de classe A, et je la spécialise avec la classe B pour la mettre dans une variable de type B", mais si a est de classe A, elle n'est pas de classe B, donc tu obtiens une erreur de type ClassCastException. B étend A, donc n'est pas A. Si tu avais écrit au début du code A a = new B();, tu aurais pu, puisque l'instance référencée par la variable a aurait bien été de classe B.
En résumé, on peut caster une instance de classe fille par une classe compatible, c'est-à-dire par cette classe, ou par une classe parente (ou parente de sa parente, etc...). Lorsqu'on affecte la variable à une autre variable, la classe vers laquelle on caste doit être compatible avec le type de la variable source, et avec la variable destination.
Le cast n'est pas une espèce de conversion : c'est simplement un moyen d'affecter une instance de classe dans une variable d'un type différent, mais compatible (donc soit une classe parente (ou parente de, etc.), soit une interface implémentée). Le cast est indispendable lorsqu'on a besoin de spécialiser une instance d'une classe plus générale, comme dans l'exemple suivant :
1 2 3 4 5 6
| public void faire(A a) { // on peut passer en argument des instances de A, ou de B
if ( a instanceof B ) { // si a référence une instance de classe B
B b = (B) a; // on spécialise l'instance référencée par la variable a en classe B (ce qu'on a vérifié par le test avant), pour la mettre dans une variable de type B (indispensable de caster ici)
// maintenant on peut appeler des méthodes spéciifques de B (qui n'existent pas dans A) par la variable b (ce qu'on ne pourrait pas faire directement par a)
}
} |
Il est inutile de caster pour mettre une instance dans une variable de classe parente (ou parente de, etc.). On peut toujours écrire ;
Object variable = une variable de n'importe quel type, puisqu'ils étendent tous finalement Object
ou
Object variable = new n'importe quelle classe
Partager