我想实现一个抽象的层次结构类。任何层次结构对象都应具有父级(可以为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上。由于thisHierarchy类型而不是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;
    }
}

09-11 20:55