Bon me revoilà avec les generics
Soyez indulgents et tapez pas trop fort
Mon idée de départ :
J'ai une interface qui va servir à initialiser des objets :
Code :
- interface Parameters<T> {
- public void init(T object);
- }
|
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 :
- public class MyAbstractClass1 {
- private Parameters parameters;
- public MyAbstractClass1(Parameters parameters) {this.parameters=parameters;}
- // Type safety: The method init(Object) belongs to the raw type Parameters. References to generic type Parameters<T>
- // should be parameterized
- public final void initFromParameters() {this.parameters.init(this);}
- }
|
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 :
- public class SomeParameters1 implements Parameters<MyClass1> {
- private int param;
- public SomeParameters1(int param) {this.param = param;}
- public void init(MyClass1 myClass) {myClass.setParam(this.param);}
- }
- public class MyClass1 extends MyAbstractClass1 {
- public MyClass1(SomeParameters1 parameters) {super(parameters);}
- private int param;
- public void setParam(int param) {this.param = param;}
- }
|
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 :
- public class MyAbstractClass2 {
- private Parameters<MyAbstractClass2> parameters;
- public MyAbstractClass2(Parameters<MyAbstractClass2> parameters) {this.parameters=parameters;}
- public final void initFromParameters() {this.parameters.init(this);}
- }
- public class SomeParameters2 implements Parameters<MyClass2> {
- private int param;
- public SomeParameters2(int param) {this.param = param;}
- public void init(MyClass2 myClass) {myClass.setParam(this.param);}
- }
- public class MyClass2 extends MyAbstractClass2 {
- // The constructor MyAbstractClass2(SomeParameters2) is undefined
- public MyClass2(SomeParameters2 parameters) {super(parameters);}
- private int param;
- public void setParam(int param) {this.param = param;}
- }
|
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 :
- public class MyAbstractClass4 {
- private Parameters<? super MyAbstractClass4> parameters;
- public MyAbstractClass4(Parameters<? super MyAbstractClass4> parameters) {this.parameters=parameters;}
- public final void initFromParameters() {this.parameters.init(this);}
- }
- public class SomeParameters4 implements Parameters<MyClass4> {
- private int param;
- public SomeParameters4(int param) {this.param = param;}
- public void init(MyClass4 myClass) {myClass.setParam(this.param);}
- }
- public class MyClass4 extends MyAbstractClass4 {
- // The constructor MyAbstractClass4(SomeParameters4) is undefined
- public MyClass4(SomeParameters4 parameters) {super(parameters);}
- private int param;
- public void setParam(int param) {this.param = param;}
- }
|
Mais bon ça marche pas.
J'avais aussi essayé en "sous-boundant", mais c'était trop restrictif :
Code :
- public class MyAbstractClass3 {
- private Parameters<? extends MyAbstractClass3> parameters;
- public MyAbstractClass3(Parameters<? extends MyAbstractClass3> parameters) {this.parameters=parameters;}
- // Bound mismatch: The method init(? extends MyAbstractClass3) of type Parameters<? extends MyAbstractClass3> is not applicable
- // for the arguments (MyAbstractClass3). The wildcard parameter ? extends MyAbstractClass3 has no lower bound, and may actually be
- // more restrictive than argument MyAbstractClass3
- public final void initFromParameters() {this.parameters.init(this);}
- }
- public class SomeParameters3 implements Parameters<MyClass3> {
- private int param;
- public SomeParameters3(int param) {this.param = param;}
- public void init(MyClass3 myClass) {myClass.setParam(this.param);}
- }
- public class MyClass3 extends MyAbstractClass3 {
- public MyClass3(SomeParameters3 parameters) {super(parameters);}
- private int param;
- public void setParam(int param) {this.param = param;}
- }
|
En désespoir de cause, j'ai tenté ça :
Code :
- public abstract class MyAbstractClass5 {
- private Parameters<? super MyAbstractClass5> parameters;
- public <T extends Parameters<? super MyAbstractClass5>> MyAbstractClass5(T parameters) {this.parameters=parameters;}
- public final void initFromParameters() {this.parameters.init(this);}
- }
- public class SomeParameters5 implements Parameters<MyClass5> {
- private int param;
- public SomeParameters5(int param) {this.param = param;}
- public void init(MyClass5 myClass) {myClass.setParam(this.param);}
- }
- public class MyClass5 extends MyAbstractClass5 {
- // Bound mismatch: The generic constructor MyAbstractClass5(T) of type MyAbstractClass5 is not applicable for the arguments (SomeParameters5)
- // since the type SomeParameters5 is not a valid substitute for the bounded parameter <T extends Parameters<? super MyAbstractClass5>>
- public MyClass5(SomeParameters5 parameters) {super(parameters);}
- private int param;
- public void setParam(int param) {this.param = param;}
- }
|
Je vais continuer à lire les différentes docs ... ![[:neowen] [:neowen]](https://forum-images.hardware.fr/images/perso/neowen.gif)
Message édité par bobuse le 27-01-2005 à 11:39:36
---------------
get amaroK plugin