2012-05-11 9 views
0

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); 
      //... 
     } 
} 
+1

Cela semble très peu probable pour moi. Veuillez montrer un exemple court mais * complet * démontrant le problème. –

Répondre

0

examen de ces points:

  1. Prouvez que vous POSITIF recevez un argument null dans la construction ou (imprimez-le);
  2. Vérifiez les autres constructeurs dans vos classes. Vous appelez peut-être un constructeur que vous ne souhaitez pas appeler, notamment en raison du type générique de cet argument.
+0

L'argument n'est certainement pas nul quand je le passe, et null quand il arrive dans le constructeur de base. De plus, aucune des trois classes en question n'a d'autre constructeur dans le code. – dzirique

+0

Par quels moyens l'avez-vous vérifié? Il est préférable si vous pouvez afficher le code qui imprime ces résultats. Définir 'espion T statique (T x) {System.out.println (" x = "+ x); return x; } 'et l'appel dans les appels' super', ainsi que dans le constructeur de la classe de base. –

+0

En consignant la valeur de parent dans la console en mode de développement GWT. – dzirique

0

Avez-vous vérifié que votre parent est nonnull vous donner votre constructeur de SpecialFoo?

+0

Lorsque je débogue, le parent n'est pas nul dans le constructeur SpecialFoo et dans le constructeur Foo, mais il est en effet null dans le constructeur de AbstractFoo. – dzirique

+0

Alors, essayez d'écrire le plus petit exemple possible causant le problème. Vous pouvez trouver le problème vous-même en faisant fondre votre code. – philnate

Questions connexes