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