[Tiger] generics : faire un "bridge"

generics : faire un "bridge" [Tiger] - Java - Programmation

Marsh Posté le 26-01-2005 à 18:34:09    

Bon me revoilà avec les generics [:dawa]
Soyez indulgents et tapez pas trop fort :o  
 
Mon idée de départ :
J'ai une interface qui va servir à initialiser des objets :

Code :
  1. interface Parameters<T> {
  2.     public void init(T object);
  3. }


Par la suite, j'essaye de coder une classe abstraite qui possède un attribut de type Parameters, et apelle la fonction init sur elle-même. En non générique ça donnerai ça :

Code :
  1. public class MyAbstractClass1 {
  2.     private Parameters parameters;
  3.     public MyAbstractClass1(Parameters parameters) {this.parameters=parameters;}
  4.     // Type safety: The method init(Object) belongs to the raw type Parameters. References to generic type Parameters<T>  
  5.     // should be parameterized
  6.     public final void initFromParameters() {this.parameters.init(this);}
  7. }


En commentaire, c'est le warning donné par eclipse. C'est normal, j'affecte un type brut à un type paramétré !
Je continue avec cet exemple en type brut, pour montrer à quoi me sert tout ça :

Code :
  1. public class SomeParameters1 implements Parameters<MyClass1> {
  2.     private int param;
  3.     public SomeParameters1(int param) {this.param = param;}
  4.     public void init(MyClass1 myClass) {myClass.setParam(this.param);}   
  5. }
  6. public class MyClass1 extends MyAbstractClass1 {
  7.     public MyClass1(SomeParameters1 parameters) {super(parameters);}
  8.     private int param;
  9.     public void setParam(int param) {this.param = param;}
  10. }


Voilà, avec ce design-pattern (il a un nom ? :??:), j'ai juste à instancier mon objet avec un Parameters, et la méthode initFromParameters() héritée me permet d'initaliser cet objet.
 
Mais bon revenons-en à mon warning. Je vais essayer d'utiliser un type générique jusqu'au bout :) ...
 
Voilà toutes les tentatives infructueuses que j'ai faites :(
 
Premier essai :

Code :
  1. public class MyAbstractClass2 {
  2.     private Parameters<MyAbstractClass2> parameters;
  3.     public MyAbstractClass2(Parameters<MyAbstractClass2> parameters) {this.parameters=parameters;}
  4.     public final void initFromParameters() {this.parameters.init(this);}
  5. }
  6. public class SomeParameters2 implements Parameters<MyClass2> {
  7.     private int param;
  8.     public SomeParameters2(int param) {this.param = param;}
  9.     public void init(MyClass2 myClass) {myClass.setParam(this.param);}   
  10. }
  11. public class MyClass2 extends MyAbstractClass2 {
  12.     // The constructor MyAbstractClass2(SomeParameters2) is undefined
  13.     public MyClass2(SomeParameters2 parameters) {super(parameters);}
  14.     private int param;
  15.     public void setParam(int param) {this.param = param;}
  16. }


En commentaire l'erreur affichée.
C'est normal, parameters est un sous-type de Parameters<MyClass2> qui n'est pas affectable à Parameters<MyAbstractClass2>
 
OK, j'ai cas bounder le paramétrage de ce Parameters :

Code :
  1. public class MyAbstractClass4 {
  2.     private Parameters<? super MyAbstractClass4> parameters;
  3.     public MyAbstractClass4(Parameters<? super MyAbstractClass4> parameters) {this.parameters=parameters;}
  4.     public final void initFromParameters() {this.parameters.init(this);}
  5. }
  6. public class SomeParameters4 implements Parameters<MyClass4> {
  7.     private int param;
  8.     public SomeParameters4(int param) {this.param = param;}
  9.     public void init(MyClass4 myClass) {myClass.setParam(this.param);}   
  10. }
  11. public class MyClass4 extends MyAbstractClass4 {
  12.     // The constructor MyAbstractClass4(SomeParameters4) is undefined
  13.     public MyClass4(SomeParameters4 parameters) {super(parameters);}
  14.     private int param;
  15.     public void setParam(int param) {this.param = param;}
  16. }


Mais bon ça marche pas.
 
J'avais aussi essayé en "sous-boundant", mais c'était trop restrictif :

Code :
  1. public class MyAbstractClass3 {
  2.     private Parameters<? extends MyAbstractClass3> parameters;
  3.     public MyAbstractClass3(Parameters<? extends MyAbstractClass3> parameters) {this.parameters=parameters;}
  4.     // Bound mismatch: The method init(? extends MyAbstractClass3) of type Parameters<? extends MyAbstractClass3> is not applicable
  5.     // for the arguments (MyAbstractClass3). The wildcard parameter ? extends MyAbstractClass3 has no lower bound, and may actually be  
  6.     // more restrictive than argument  MyAbstractClass3
  7.     public final void initFromParameters() {this.parameters.init(this);}
  8. }
  9. public class SomeParameters3 implements Parameters<MyClass3> {
  10.     private int param;
  11.     public SomeParameters3(int param) {this.param = param;}
  12.     public void init(MyClass3 myClass) {myClass.setParam(this.param);}   
  13. }
  14. public class MyClass3 extends MyAbstractClass3 {
  15.     public MyClass3(SomeParameters3 parameters) {super(parameters);}
  16.     private int param;
  17.     public void setParam(int param) {this.param = param;}
  18. }


 
En désespoir de cause, j'ai tenté ça :

Code :
  1. public abstract class MyAbstractClass5 {
  2.     private Parameters<? super MyAbstractClass5> parameters;
  3.     public <T extends Parameters<? super MyAbstractClass5>> MyAbstractClass5(T parameters) {this.parameters=parameters;}
  4.     public final void initFromParameters() {this.parameters.init(this);}
  5. }
  6. public class SomeParameters5 implements Parameters<MyClass5> {
  7.     private int param;
  8.     public SomeParameters5(int param) {this.param = param;}
  9.     public void init(MyClass5 myClass) {myClass.setParam(this.param);}   
  10. }
  11. public class MyClass5 extends MyAbstractClass5 {
  12.     // Bound mismatch: The generic constructor MyAbstractClass5(T) of type MyAbstractClass5 is not applicable for the arguments (SomeParameters5)
  13.     // since the type SomeParameters5 is not a valid substitute for the bounded parameter <T extends Parameters<? super MyAbstractClass5>>
  14.     public MyClass5(SomeParameters5 parameters) {super(parameters);}
  15.     private int param;
  16.     public void setParam(int param) {this.param = param;}
  17. }


 
Je vais continuer à lire les différentes docs ... [:neowen]


Message édité par bobuse le 27-01-2005 à 11:39:36

---------------
get amaroK plugin
Reply

Marsh Posté le 26-01-2005 à 18:34:09   

Reply

Marsh Posté le 26-01-2005 à 19:09:21    

deux questions/remarques:
- pourquoi tu réutilises pas le meme topic?
- déjà dit, mais avec un cas d'utilisation concret, non seulement on comprendrait mieux ton problème, mais il est aussi probable que toi aussi... non ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-01-2005 à 09:23:28    

1) ben c'est parce que à part le fait que ce soit des generics, ça ne traite pas du même cas ...
 
2) Ben si tu veux, dans mon projet MyAbstractClass est le type Population (class abstraite). Et MyClass est une population particulière, par exemple FishPopulation :D
 
J'ai donc mon cadre générique avec Population et Parameters. Et j'ai une application qui utilise ce cadre avec les classes FishPopulation et FishPopulationParameters (pour SomeParameters dans l'exemple). Je veux juste avoir à spécifier comment ces  FishPopulationParameters initialisent une FishPopulation, et ensuite ma population (FishPopulation) sera initialisable avec son attribut FishPopulationParameters.


---------------
get amaroK plugin
Reply

Marsh Posté le 27-01-2005 à 09:51:57    

Citation :

Code :
  1. public <T extends Parameters<? super MyAbstractClass5>> MyAbstractClass5(T parameters) {this.parameters=parameters;}



 
KAMOULOX §§§§

Reply

Marsh Posté le 27-01-2005 à 10:03:38    

:heink: gné ?


---------------
get amaroK plugin
Reply

Marsh Posté le 27-01-2005 à 11:39:06    

Il me semble que ce que je fait, n'est ni plus ni moins qu'un bridge :
http://www.dofactory.com/Patterns/PatternBridge.aspx
 
Le tout est donc de faire un bridge avec des generics


---------------
get amaroK plugin
Reply

Marsh Posté le 27-01-2005 à 12:29:24    

c'est quoi un "Parameter" ? tu as des exemples concret de ce que c'est ?

Reply

Marsh Posté le 27-01-2005 à 12:56:55    

Bin SomeParameters est un exemple.
 
Plus concret si tu veux, Je peux avoir un FishPopulationParameters qui servent à initialiser les attributs de ma FishPopulation du genre, une population qui a besoin de deux attributs pour initialiser l'âge de ses membres selon une gaussienne :

Code :
  1. public class FishPopulation  extends Population {
  2.     private int ageCentre;
  3.     private int ageSigma;
  4.     // ...
  5.     private void init() {
  6.        // initialise les âges des membres selon une gaussienne
  7.     }
  8. }


 
Du coup mon FishPopulationParameters ressemblerait à :

Code :
  1. public class FishPopulationParameters extends Parameters<FishPopulation> {
  2.     private int ageCentre;
  3.     private int ageSigma;
  4.     public FishPopulationParameters(int centre,int sigma) {
  5.         ageCentre=centre;
  6.         ageSigma=sigma;
  7.     }
  8.     public void init(FishPopulation pop) {
  9.         pop.setAgeCentre(ageCentre);
  10.         pop.setAgeSigma(ageSigma);
  11.     }
  12. }


---------------
get amaroK plugin
Reply

Sujets relatifs:

Leave a Replay

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