methodes abstr avec des arguments generiques dans une classe abstr

methodes abstr avec des arguments generiques dans une classe abstr - Java - Programmation

Marsh Posté le 09-03-2006 à 14:48:57    

Bonjour,
 
J'aimerais utiliser une classe abstraite, pour utilsier à l'interieur des méthodes abstraites, que je pourrai implémenter dans des classes qui hériteront de ma classe abstraites.
 
Mais dans ces méthodes, je souhaiterai utiliser des arguments génériques,  mais je n'y arrive pas.
 
J'ai essayé:
 
public abstract class AbstractSetoid {
    public abstract bool equal(<T> a, <T> b);
}
 
Mais il me met cela:
 
AbstractSetoid.java:2: illegal start of type
    public abstract bool equal(<T> a, <T> b);
                               ^
AbstractSetoid.java:2: < expected
    public abstract bool equal(<T> a, <T> b);
                                            ^
2 errors
 
Quelqu'un voit ce qu'il faudrait faire? On est forcément obligé de passer le paranètre générique à la classe?
 
Merci :-)
A+


Message édité par thierry_b le 09-03-2006 à 14:52:30
Reply

Marsh Posté le 09-03-2006 à 14:48:57   

Reply

Marsh Posté le 09-03-2006 à 14:56:08    

non, mais tu peux faire une opération générique, et réutilisiser le type générique comme paramêtre.
 
public abstract<T>  bool equal(T a, T b);  
 
http://www.informit.com/articles/a [...] Num=3&rl=1

Reply

Marsh Posté le 09-03-2006 à 15:34:33    

Merci :-)
 
Je voulais savoir aussi, car d'après ce que j'ai lu , ce n'est pas possible, mais on ne peut pas avoir d'attribut déclaré comme type paramétré?
 
Et dans ce cas, la meilleur facon de contourner ce pb serait qque chsoe du genre:
 abstract <T> T element() ?
 
Merci.
A+
 

Message cité 1 fois
Message édité par thierry_b le 09-03-2006 à 15:40:25
Reply

Marsh Posté le 09-03-2006 à 15:48:04    

thierry_b a écrit :


Je voulais savoir aussi, car d'après ce que j'ai lu , ce n'est pas possible, mais on ne peut pas avoir d'attribut déclaré comme type paramétré?


 
tu as lut ça ou ?
 

Code :
  1. public class A<T> {
  2. private T myAttribut;
  3. }

Reply

Marsh Posté le 09-03-2006 à 15:50:41    

Re,
 
euh je voulais dire sans forcement declarer le type paramétré  au niveau de la classe, comme pour les méthodes, c'est aussi possible?
 
Merci :-)
A+

Reply

Marsh Posté le 09-03-2006 à 15:54:36    

ah :o
 
Déclare le en Object dans ce cas ton attribut, mais c'est très très sale :o

Reply

Marsh Posté le 09-03-2006 à 16:14:56    

Ha ok.
 
Et par exemple pour une eventuelle méthode élément qui prend rien en argument et qui renverrait un T, je voulais mettre qque chose de ce genre:
 
public abstract class AbstractSetoid {
public abstract T element();
}
 
et il m'a mis ca:
AbstractSetoid.java:5: cannot find symbol
symbol  : class T
location: class AbstractSetoid
    public abstract T element();
                    ^
1 error
 
et par contre, si je mets ceci:
public abstract <T> T element();
 
même si je n'ai pas d'argument de type T dans la méthode element, ca marche.
 
Comment ca se fait?
 
Et si après dans une classe abstraite qui hérite de ma 1ere classe abstraite, je fais ceci:
 
public abstract class AbstractSetoidWithOne extends AbstractSetoid {
 
    public abstract <T> T one();
     
    public <T> boolean is_one(T x) {
 return (this.equal(x,one()));
    }
 
    public <T> T element() {
 return this.one();
    }
}
 
Il n'st pas content...et il me dit ceci:
 
hierry@debian:~/Master/Projet/pstl26$ javac AbstractSetoidWithOne.java
AbstractSetoidWithOne.java:10: type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds T,java.lang.Object
        return this.one();
 
Merci
A+


Message édité par thierry_b le 09-03-2006 à 16:17:47
Reply

Marsh Posté le 09-03-2006 à 16:58:20    

Là, il va falloir aller lire un peu ce que sont les générics de java, tu mélange le paramétrage et l'utilisation des types paramétrés :  
 
http://lroux.developpez.com/articl [...] age=page_5

Reply

Marsh Posté le 09-03-2006 à 17:14:28    

Re,
 
Ben j'avais deja lu ca, mais ca me semble pas plus clair.
 
D'après ce que j'ai compris, le type que tu mets entre public et ta valeur de retour, sert à préciser le type exact à assigner à ton argument.
 
Mais je ne comprends tjs pas pkoi
 
public abstract T element() marche pas, mais  
public abstract <T> T element() marche :-(.
 
 
Merci :-)
A+
 

Reply

Marsh Posté le 09-03-2006 à 17:31:03    

parce que dans le premier cas, tu ne définit pas ce qu'est T, alors que dans le second on sait que T est un template paramerter de m"thode générique.

Reply

Marsh Posté le 09-03-2006 à 17:31:03   

Reply

Marsh Posté le 09-03-2006 à 17:39:58    

Ha ok,
 
mais imaginons maintena,t que je veuille faire une classe abstraite qui hérite de la 1ère ou j'ecris deja ceci:
 
public abstract class AbstractSetoidWithOne extends AbstractSetoid {
 
    public abstract <T> T one();
     
    public <T> boolean is_one(T x) {
 return (this.equal(x,one()));
    }
 
Maintenant, comme elle hérite de la 1ere, je vais implémenter la méthode element, en lui faisant retourner this.one().
C'est censé marcher vu que one() retourne un élèment de type T et que dans ma 1ere classe, j'avais dit que element retournait un element de type T.
 
Pourquoi dans ce cas ni  
 
 public T element() {
 return this.one();
    }  
 
et ni:
 
 public <T> T element() {
 return this.one();
    }
 
ne marchent dans cette seconde classe?
 
Merci.
A+


Message édité par thierry_b le 09-03-2006 à 17:40:14
Reply

Marsh Posté le 09-03-2006 à 17:45:18    

Juste une question, a ton avis, tu as combien de T différent (conceptuellement) dans ta classe telle que tu l'a écrit ?  
 

Reply

Marsh Posté le 09-03-2006 à 17:45:37    

(je sens que je suis mur pour faire un apté ce soir)

Reply

Marsh Posté le 09-03-2006 à 17:48:58    

Euh,  
j'aurai dit un..mais tel que tu poses la question, ca n'a pas l'air d'etre le cas lol.
 

Reply

Marsh Posté le 09-03-2006 à 20:18:28    

Donc en gros, pas moyen d'implémenter ma fonction element() dans la classe qui hérite de la 1ere?
 
Merci
A+

Reply

Marsh Posté le 09-03-2006 à 20:32:02    

En fait, il y a effectivmeent pas UN , mais deux T différent. Un Type paramétrique est local à l'élément qui le défini. Par exemple tu avais défini deux méthodes génériques, mais on sent qu'entre les deux, c'est un peu le même T. Donc, il va falloir le migrer vers l'élément englobant : la classe.
 
Au final, tu dois obtenir un truc comme ça :  
 

Code :
  1. abstract class AbstractSetoid<T> {
  2. public abstract T element();
  3. }
  4. public class AbstractSetoidWithOne<T> extends AbstractSetoid<T> {
  5. public T element() {
  6.  return null;
  7. }
  8. }


 
Mais en fait, il y a une autre question à se poser :  
 
Pourquoi as-tuy besoin des génériques ?


Message édité par kadreg le 09-03-2006 à 20:32:35

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 09-03-2006 à 20:33:34    

Ok.
 
Merci :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed