Le cast en Java .. [Résolu/Fermé]

Signaler
Messages postés
43
Date d'inscription
lundi 8 septembre 2014
Statut
Membre
Dernière intervention
27 janvier 2016
-
Messages postés
43
Date d'inscription
lundi 8 septembre 2014
Statut
Membre
Dernière intervention
27 janvier 2016
-
Bonsoir :D

Comment on fait le cast en java ?

En fait : J'ai deux classes A et B avec A extends B .. j'ai une méthode nommée "Meth" dans la classe B et une instance "Exmp" de la classe A (en fait elle est de la classe B mais stockée dans A) .. je veux utiliser la méthode "Meth" sur l'instance "Exmp" mais ça me sort une erreur !

Merci beaucoup d'avance :)

3 réponses

Messages postés
16054
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
9 octobre 2020
2 696
Bonjour,

"elle est de la classe B mais stockée dans A"
Impossible : si A extends B, une instance de A peut être stockée dans une variable de type B, mais pas l'inverse, sauf si A=B.

Exemple :

Object obj = new Object(); // Object est B
String str = obj; // String est A, extends B

Ce code est impossible, il n'y a rien qui permet de construire un String à partir d'un Object.

En revanche :

String str = "test"; // String est A, extends B
Object obj = str; // Object est B

Ça c'est possible, on perd la spécificité du String mais ça reste un Object valable.

Pour l'histoire du cast en Java, cela permet de passer d'une variable de classe B à une variable de classe A extends B, uniquement si l'objet dans la variable est bien une instance de A.

String str = "test"; // String est A, extends B
Object obj = str; // Object est B
String str2 = (String) obj; // on caste B en A, peut échouer

Pour être propre, il vaut mieux toujours faire une vérification du type réel d'un objet avant de le caster, ça évite les surprises...

String str = "test"; // String est A, extends B
Object obj = str; // Object est B
if (obj!=null && !(obj instanceof String))
    throw new IllegalStateException("String expected but "+obj.getClass()+" found: "+obj);
String str2 = (String) obj; // on caste B en A, ne peut pas échouer

La confiance n'exclut pas le contrôle
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
256
"mais ça me sort une erreur"
Quelle erreur ?
Messages postés
43
Date d'inscription
lundi 8 septembre 2014
Statut
Membre
Dernière intervention
27 janvier 2016

The method Meth() is undefined for the type A
Messages postés
14733
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 octobre 2020
256
Ta méthodes est bien publique ?
Pourrais-tu mettre le code pour nous aider à comprendre ?
la coloration syntaxique.
Messages postés
43
Date d'inscription
lundi 8 septembre 2014
Statut
Membre
Dernière intervention
27 janvier 2016

Oui, mes méthodes sont bien publiques !

Merci KX pour ton explication :D

Voilà le code qui ne marche pas :

A[] Tab = new A[5];
Tab[0] = new B();
Tab[1] = new C();
Tab[2] = new C();
Tab[3] = new B();
Tab[4] = new B();

(B et C sont deux classes filles de A)

A[] Tableau = new A[5];
Tableau[0] = Tab[3];
System.out.println(Tableau[0].Meth());

(Meth est une méthode définie dans B)
Messages postés
16054
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
9 octobre 2020
2 696
B et C sont deux classes filles de A
Donc tu as B extends A, et non l'inverse que tu indiquait tout à l'heure...

A[] Tableau = new A[5];
...
if (Tableau[0] instanceof B)
    System.out.println(((B) Tableau[0]).Meth()); 

Remarque : pour ce genre de code on préfèrera plutôt avoir une méthode défnie dans A, quitte à la changer dans B et C, mais ça permettrait de travailler avec n'importe quel A... c'est d'ailleurs le principe de toString lorsqu'il s'agit d'affichage.
Messages postés
43
Date d'inscription
lundi 8 septembre 2014
Statut
Membre
Dernière intervention
27 janvier 2016

Aaah oui je vois !

Merci infiniment, mon problème est résolu :D