传递给超级构造函数时,构造函数参数会丢失

时间:2012-05-11 12:38:11

标签: java generics gwt constructor nested-generics

在我的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。我不知道为什么会这样。任何人都可以告诉我我需要做什么才能将它传递给抽象基类而不受伤害?


修改 我想我已经解决了......诀窍似乎是我必须在每个子类中声明父参数,以便有更具体的引用,如下所示:

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

2 个答案:

答案 0 :(得分:0)

回顾这些要点:

  1. 证明您正在构造函数中接收null参数(打印);
  2. 检查班级中的其他构造函数。您可能正在调用一个您不希望调用的构造函数,尤其是由于该参数的泛型类型。

答案 1 :(得分:0)

您是否检查过您的父母是 null您是否给了您的SpecialFoo构造函数?