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


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

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

2 回答 2

0

回顾以下几点:

  1. 积极地证明您null在构造函数中接收到一个参数(打印它);
  2. 检查您的类中的其他构造函数。您可能正在调用您不希望调用的构造函数,尤其是由于该参数的泛型类型。
于 2012-05-11T12:42:13.257 回答
0

你有没有检查过你的父母不是 null你给你的 SpecialFoo 构造函数?

于 2012-05-11T12:43:29.927 回答