使用Generics强制执行类声明

时间:2014-10-04 19:46:07

标签: java generics inheritance abstract-class

我想实现一个抽象的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>声明吗?

1 个答案:

答案 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;
    }
}