我想实现一个抽象的层次结构类。任何层次结构对象都应具有父级(可以为null)和一组子级,两者的类型与层次结构的具体实现完全相同。可以使用泛型完成此操作吗?如果没有,可以使用任何机制来强制这种关系吗?
到目前为止,这是我一直在想的问题,但存在一些问题:
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>
声明? 最佳答案
那么我有什么办法可以禁止A扩展层次结构
声明?
不,不可能。
您可以使用以下方法做您想做的事情:
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;
}
}