【问题标题】:Constructor argument gets lost when passed to super constructor构造函数参数在传递给超级构造函数时丢失
【发布时间】:2012-05-12 16:00:20
【问题描述】:

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

【问题讨论】:

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

标签: java generics gwt constructor nested-generics


【解决方案1】:

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

【讨论】:

  • 我在调试的时候,在SpecialFoo构造函数和Foo构造函数中parent都不为null,但在AbstractFoo构造函数中确实为null。
  • 那么请尽量写出导致问题的最小例子。您可能会在融化代码时自己发现问题。
【解决方案2】:

复习以下几点:

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

【讨论】:

  • 参数传入的时候肯定不为null,传入基础构造函数的时候为null。此外,所讨论的三个类在代码中都没有任何其他构造函数。
  • 您是通过什么方式确定的?如果您可以显示打印这些结果的代码,那就更好了。定义static T spy(T x) { System.out.println("x = " + x); return x; } 并在super 调用以及基类构造函数中调用它。
  • 通过将 parent 的值记录到 GWT 开发模式控制台。
  • 您的日志记录方法似乎不起作用,因为无法在抽象类的非静态上下文中引用 T
  • 等等——你不是把它作为Java运行,而是编译成Javascript,然后运行它?这将改变一切。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多