私の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);
//...
}
}
私にはほとんど見かけません。この問題を示す短い例ですが、完全な例を示してください。 –