methodes abstr avec des arguments generiques dans une classe abstr - Java - Programmation
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
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+
Marsh Posté le 09-03-2006 à 15:48:04
thierry_b a écrit : |
tu as lut ça ou ?
Code :
|
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+
Marsh Posté le 09-03-2006 à 15:54:36
ah
Déclare le en Object dans ce cas ton attribut, mais c'est très très sale
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+
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
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+
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.
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+
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 ?
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.
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+
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 :
|
Mais en fait, il y a une autre question à se poser :
Pourquoi as-tuy besoin des génériques ?
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