Dans mon application GWT, j'ai un type de données (destiné à construire et suivre des hiérarchies d'objets similaires) qui étend une superclasse, qui à son tour étend une autre superclasse abstraite. Il y a un paramètre générique déclaré dans la classe abstraite qui est ensuite spécifié par chaque sous-classe comme le type de lui-même. La structure est la suivante:L'argument constructeur est perdu lorsqu'il est passé au super constructeur
public abstract class AbstractFoo<T extends AbstractFoo> {
protected T parent;
protected AbstractFoo(T parent){
if (parent != null) parent.addChild(this);
this.parent = parent;
}
//...
}
public class Foo<T extends Foo> extends AbstractFoo<T> {
public Foo(T parent){
super(parent);
//...
}
}
public class SpecialFoo<T extends SpecialFoo> extends Foo<T> {
public SpecialFoo(T parent){
super(parent);
//...
}
}
Quand je passe un argument parent au constructeur de SpecialFoo, le constructeur de Foo sera appelé comme superconstructeur, et que le constructeur appelle à son tour le constructeur de AbstractFoo comme superconstructeur . Le problème que j'ai est que l'argument parent est réinitialisé à NULL lorsqu'il est passé de Foo à AbstractFoo. Je ne sais pas pourquoi cela se produit. Quelqu'un peut-il me dire ce que je dois faire pour le transmettre à la classe de base abstraite indemne?
EDIT: Je pense que je l'ai résolu ... L'astuce semble être que je dois déclarer l'argument parent dans chaque sous-classe, afin qu'il y ait une référence plus spécifique à elle, comme si:
public abstract class AbstractFoo<T extends AbstractFoo> {
protected T parent;
protected AbstractFoo(T parent){
if (parent != null) parent.addChild(this);
this.parent = parent;
}
//...
}
public class Foo<T extends Foo> extends AbstractFoo<T> {
protected T parent;
public Foo(T parent){
super(parent);
//...
}
}
public class SpecialFoo<T extends SpecialFoo> extends Foo<T> {
private SpecialFoo parent;
public SpecialFoo(T parent){
super(parent);
//...
}
}
Cela semble très peu probable pour moi. Veuillez montrer un exemple court mais * complet * démontrant le problème. –