TP6-Question 1, problème de type

Programmation Avancée

Moderator: douinj

Post Reply
marti_r1
Posts: 66
Joined: 07 Oct 2021 20:16

TP6-Question 1, problème de type

Post by marti_r1 » 20 Nov 2021 21:10

Voici ma question, je précise que je ne comprends vraiment pas grand-chose au type de retour comme par exemple dans le cours lorsqu’il est indiqué p51 par exemple :

public <T> T accepter(Visiteur<T> v){
return v.visiteurNombre(this) ;
}

v.visiteurNombre(this) de type <T> T ?
<T>, oui c’est de la généricité par rapport à n’importe quel type non primitif, T n’importe quel type non primitif mais <T> T ?

Bref, c’est peut-être à cause de cela que mon code présenté ci-dessous et mon raisonnement ne fonctionne pas ?
J’ai écrit ça :

Expression addition=new Addition(new Variable(m,"x",3), new Constante(4));
VisiteurExpression visiteur=new VisiteurEvaluation(m);
addition.accepter(visiteur).intValue() ;

addition.accepter(visiteur) retourne alors visiteur.visite(addition).

Si dans la classe VisiteurEvaluation on a les méthodes suivantes :

public Integer visite(Constante c){
return (Integer)c.valeur();
}

public Integer visite(Variable v){
return c.lire(v.nom());
}

public Integer visite(Addition a){
Integer i1=a.op1().accepter(this);
Integer i2=a.op2().accepter(this);
return i1+i2;
}

Puisque addition est un objet de classe Addition, la méthode choisie par visiteur est la troisième présentée ci-dessus et visiteur.visite(addition) "fait" a.op1().accepter(visiteur) et a.op2().accepter(visiteur).

a.op1().accepter(visiteur) retourne visiteur.visite(a.op1) puisque a.op1 est un objet de classe Variable, la méthode choisie par visiteur est la seconde présentée ci-dessus :
c.lire(a.op1.nom()).
a.op1.nom() retourne la chaine de caractère "x" et c.lire("x") "fait" en fait m.lire("x") qui revient à affecter à la variable valeur de classe Integer la valeur associée à la clé "x" dans le treeMap, table, de m, soit Integer valeur=3.
Ainsi i1 de classe Integer reçoit un Integer qui vaut 3.

a.op2().accepter(visiteur) retourne visiteur.visite(a.op2) puisque a.op2 est un objet de classe Constante, la méthode choisie par visiteur est la première présentée ci-dessus : a.op2.valeur qui est un int, "casté" en Integer puisque cette méthode retourne un Integer qui sera 4.
Ainsi i2 de classe Integer reçoit un Integer qui vaut 4.

i1+i2 fourni bien un Integer qui vaut 7, retourné par la méthode visite(Addition a).
Et si par la suite on applique sur ce résultat, .intValue(), cette valeur 7 est "castée" en un type primitif 7.

Et bien ça ne fonctionne pas car BlueJ me dit pour Integer i1=a.op1().accepter(this) ou bien Integer i2=a.op2().accepter(this), incompatible type : java.lang.Object cannot be converted to java.lang.Integer.
Mais this bien entendu que c’est un objet puisque c’est visiteur de classe VisiteurEvaluation et il me semble avoir démontré par mon raisonnement qu’à la fin cette ligne de code retourne bien un Integer !
Je ne comprends pas trop là ?
Cordialement

marti_r1
Posts: 66
Joined: 07 Oct 2021 20:16

Re: TP6-Question 1, problème de type

Post by marti_r1 » 20 Nov 2021 22:28

C'est bon j'ai trouvé mon erreur, mauvaise "en-tête" : public class VisiteurParDefaut<T> extends VisiteurExpression{ au lieu de public class VisiteurParDefaut<T> extends VisiteurExpression<T>{, j'ai du faire une suppression par inadvertance.
Désolé pour la question inutile

delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

Re: TP6-Question 1, problème de type

Post by delaba_q » 21 Nov 2021 1:44

Au niveau d'une classe, le type générique est une sorte de variable, qu'on peut ré-utiliser un peu partout dans la classe pour définir un type de champ, de variable ou de retour de méthode.

Par contre, si le type générique est déclaré au niveau d'une méthode, il faut d'abord le déclarer, et ensuite l'utiliser.
Exemple 1:

Code: Select all

public <T> T accepter(Visiteur<T> visiteur) { // là le type du visiteur est indiqué par la variable T de la méthode
// return qqchDuTypeT
}
Exemple 2 :

Code: Select all

public <T> void maMethode(Class<T> clazz) { // la méthode peut très bien ne rien renvoyer, mais le type T peut servir en paramètre
// ...
}
Je ne sais pas si la généricité a déjà été abordée dans le cours, mais n'hésitez à regarder sur internet sinon, il y a plein de bonnes ressources sur le sujet, en français comme en anglais :)

Post Reply