Generics et polymorphisme : comprends pas
Edit : l'ensemble du post est un peu confus (j'étais vénère :aie:). La version anglaise sur le fourm Sun est plus claire : http://forum.java.sun.com/thread.jspa?threadID=5262288
Je crée des listes de Couples<Integer, String>.
Quand j'enlève un de ces couples, j'ai une liste Enfant qui doit enlever le String correspondant grace à ces fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class MyList<String> extends Vector<String> implements ChildList{
public void fireClear() {
clear();
}
/**
* ici o correspond à un Couple
* @param o
*/
public void fireRemove(Couple<Integer, String> couple) {
System.out.println("avant :"+this);
remove(couple.getRightElement());
System.out.println("après :"+this);
}
/* Si on veut enlever directement le String ou n'importe quoi */
public void fireRemove(Object o) {
remove(o);
}
} |
Puis je remplis mes listes :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
ParentCoupleList<Integer, String> listParent=new ParentCoupleList<Integer, String>();
Couple<Integer, String>c1,c2,c3,c4,c5;
c1=new Couple<Integer, String>(1, "1");
c2=new Couple<Integer, String>(2, mySuperString);
listParent.add(c1);listParent.add(c2);
myList=new MyList();
myList.add(mySuperString);myList.add(myOtherSuperString);
listParent.registerChildList(myList); |
Et en principe, quand je supprime le couple c2 de la listeParent, je lance la fonction fireRemove(c2).
Malheureusement, le debugguer me dit que c'est la fonction fireRemove(Object o) plutot que fireRemove(Couple<Integer, String> couple) qui est choisie.
Pourquoi donc ??????????????????????????????????:aie:
PS : la classe ParentCoupleList a été testée et fonctionne correctement
Problème tout bête de surcharge de méthode avec héritage
J'ai un problème tout bête dans une classe :
Code:
1 2 3 4 5 6 7 8 9 10
|
public void fireRemove(Couple couple) {
remove(couple.getRightElement());
}
public void fireRemove(Object o) {
if (o instanceof Couple) fireRemoveCouple((Couple)o);
else remove(o);
} |
QUand je lance la fonction fireRemove(unCouple), comme Couple extends Object, cet ##{{ de JVM lance la fonction public void fireRemove(Object o), au lieu de celle destinée au Couple.
Je suppose que la JVM a ses raisons et mon bouquin de certification ne m'en dit pas davantage.
Je contourne donc le problème ainsi :
Code:
1 2 3 4 5 6 7 8 9
|
public void fireRemoveCouple(Couple couple) {
remove(couple.getRightElement());
}
public void fireRemove(Object o) {
if (o instanceof Couple) fireRemoveCouple((Couple)o);
else remove(o);
} |
Mais c'est pas beau, et si les héritages se multiplient, ce sera pire. Une idée ?