2012-05-11 22 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のコンストラクタに親引数を渡すと、フーのコンストラクタはsuperconstructorとして呼び出され、そのコンストラクタが順番にsuperconstructorようAbstractFooのコンストラクタを呼び出します。 。

私の問題は、FooからAbstractFooに渡されると、親の引数がNULLにリセットされるということです。なぜこのようなことが起こるのか分かりません。誰も私がそれを無傷の抽象基本クラスに渡すために必要なことを教えてもらえますか?


EDIT: 私はそれを解決したと思う...トリックは、私はそれをより具体的な言及があるように、各サブクラスで親引数を宣言しなければならないということのようです、

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ではなく、ベースコンストラクタに渡されたときはnullです。また、問題の3つのクラスのいずれもコード内に他のコンストラクタを持っていません。 – dzirique

+0

どういう意味でそれを確認しましたか?これらの結果を出力するコードを表示できるのが望ましいです。静的なTスパイ(Tx){System.out.println( "x =" + x); xを返します。 } 'を呼び出し、それを' super'呼び出しと、基本クラスのコンストラクタで呼び出します。 –

+0

親の値をGWT開発モードコンソールに記録する。 – dzirique

0

はあなたの親はあなたのSpecialFooコンストラクタを与えるnullであることを確認しましたか?

+0

私がデバッグしているとき、親はSpecialFooコンストラクタとFooコンストラクタでnullではありませんが、AbstractFooコンストラクタでは実際にはnullです。 – dzirique

+0

それで問題の原因となる可能な限り小さな例を書いてみてください。コードを解凍しているときに問題が発生することがあります。 – philnate

関連する問題