【问题标题】:Enforce class declarations with Generics使用泛型强制类声明
【发布时间】:2014-10-04 19:46:06
【问题描述】:

我想实现一个抽象的 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&lt;B&gt; 声明?

【问题讨论】:

    标签: java generics inheritance abstract-class


    【解决方案1】:

    那么有什么方法可以禁止 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;
        }
    }
    

    【讨论】:

    • 看来这样做还是有好处的Hierarchy&lt;T extends Hierarchy&lt;T&gt;&gt;
    猜你喜欢
    • 2015-12-14
    • 2018-12-14
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    相关资源
    最近更新 更多