2012-05-11 86 views
0

在我的GWT应用程序中,我有一个扩展超类的数据类型(用于构建和跟踪类似对象的层次结构),这又扩展了另一个抽象超类。在抽象类中声明了一个通用参数,然后由每个子类指定为它自己的类型。结构如下:构造函数参数在传递给超级构造函数时会丢失

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

当我通过父母参数SpecialFoo的构造,foo的构造函数将被称为一个超类,而构造函数将依次调用AbstractFoo的构造函数的超类。

我遇到的问题是,当从Foo传递给AbstractFoo时,父参数被重置为NULL。我不知道为什么会发生这种情况。任何人都可以告诉我需要做什么才能将其传递给抽象基类而不受伤害?


编辑: 我想我已经解决了它,秘诀似乎是,我必须声明parent参数中的每个子类中,以便有更具体的参考吧,像这样:

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

似乎不太可能对我。请展示一个简短但完整的示例来说明问题。 –

回答

0

回顾以下几点:

  1. 证明肯定你是在构建接收null说法或(打印);
  2. 在您的课程中检查其他构造函数。您可能正在调用一个您不希望调用的构造函数,特别是由于该参数的泛型类型。
+0

当我传入参数时,参数绝对不为空,当它到达基础构造函数时为null。此外,这三个类中没有任何一个在代码中具有其他构造函数。 – dzirique

+0

你用什么手段确定?如果您可以显示打印这些结果的代码,则最好。定义'static T spy(T x){System.out.println(“x =”+ x); return x; }'并在'super'调用以及基类构造函数中调用它。 –

+0

通过将父项的值记录到GWT开发模式控制台。 – dzirique

0

是否检查你的父母是null你给你的SpecialFoo构造?

+0

当我调试时,父类在SpecialFoo构造函数和Foo构造函数中不为null,但它在AbstractFoo构造函数中确实为null。 – dzirique

+0

那么请尝试编写导致问题的最小可能示例。您可能会在解码代码时自己发现问题。 – philnate