我想实现一个抽象的Hierarchy类。任何Hierarchy对象都应该有一个父对象(可以为null)和一组子对象,它们的类型与Hierarchy的具体实现完全相同。这可以用泛型来完成,如果没有,是否有任何机制来强制执行这种关系?
这是我到目前为止的想法,但有一些问题:
public abstract class Hierarchy<T extends Hierarchy<T>> {
private T parent;
private Set<T> children;
public T getRoot() {
if( parent == null ) {
return this;
} else {
return parent.getRoot();
}
}
}
问题在于return this
。它给出了编译错误,因为this
的类型为Hierarchy
,而不是T
。我无法强制转换它,因为我实际上并不保证this
的类型为T
。以下声明编译得很好:
public class B extends Hierarchy<B> {...}
public class A extends Hierarchy<B> {...}
那么我有什么方法可以禁止A extends Hierarchy<B>
声明吗?
答案 0 :(得分:1)
那么我有什么方法可以禁止A extends Hierarchy 声明?
不,这是不可能的。
你可以用这样的东西做你想做的事:
public abstract class Hierarchy<T> {
private T parent;
private Set<T> children;
public static <E extends Hierarchy<E>> E getRoot(E x) {
while (x.parent != null) {
x = x.parent;
}
return x;
}
}