私の 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 に渡されると、parent 引数が 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);
//...
}
}