【问题标题】:Java Class inheriting self-referencial classJava 类继承自引用类
【发布时间】:2017-11-20 07:52:41
【问题描述】:

我正在尝试在 java 类中实现一个简单的树。但是,我想要另一个类来扩展这个树类。

我正在像这样使树递归:

class Tree<T> {
    public T data;
    public List<Tree<T>> children;

    public Tree(T data){
        this.data = data;
    }
}

但是,假设我制作了这样的课程:

class WeightedTree<T> extends Tree<T>

它的孩子都是普通的树,而不是加权树。有没有办法用 OOP 原则来实现这一点?

【问题讨论】:

    标签: java oop generics inheritance tree


    【解决方案1】:

    你可以这样做:

    class Tree<T, SELF extends Tree<T, SELF>> {
        public T data;
        public List<SELF> children;
    }
    
    class WeightedTree<T> extends Tree<T, WeightedTree<T>> {}
    

    如果需要实例化Tree,可以使用通配符:

    Tree<String, ?> tree = new Tree<>();
    

    或者,您可以创建一个带有 self 类型的抽象基类,并为 TreeWeightedTree 创建单独的子类。

    【讨论】:

    • 您的通配符示例不起作用:您无法实例化这种类型。
    • @ruakh 你可以,如果可以推断的话。
    • 我的话,你是对的!太奇怪了。感谢您的指正。 :-)
    【解决方案2】:
    /* Package */ abstract class TreeBase<T, TREE_T extends TreeBase<T, TREE_T>> {
        public T data;
        public List<TREE_T> children;
    
        public TreeBase(T data) {
            this.data = data;
        }
    }
    
    public class Tree<T> extends TreeBase<T, Tree<T>> {
        public Tree(T data) {
            super(data);
        }
    }
    
    public class WeightedTree<T> extends TreeBase<T, WeightedTree<T>> {
        public WeightedTree(T data) {
            super(data);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2015-11-16
      • 2015-03-14
      相关资源
      最近更新 更多