В моем приложении 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 как суперконструктор.
У меня проблема в том, что родительский аргумент сбрасывается в NULL при передаче от Foo к AbstractFoo. Я понятия не имею, почему это происходит. Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы передать его абстрактному базовому классу целым и невредимым?
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);
//...
}
}