扩展时迭代自己类型的Java类

时间:2016-05-08 00:07:54

标签: java casting iterator extends

我想创建一个仅包含节点的自定义树数据结构,我可以在其中迭代它们。然后,我可以稍后扩展这个类并拥有非常基本的树

class Node{

    Node parent;
    ArrayList<Node> children;

    public static void main(String[]args){
        Node root = new Node();
        for(Node child : root){
            //do something
        }
    }

    public Iterator<Node> iterator(){
        // basic tree traversal iterator
    }  
}

我已经开始使用它了,但是当我尝试扩展Node类时会出现问题。对于扩展类,继承的迭代器方法仍然返回Node迭代器,这意味着我必须每次都进行转换。这是我遇到的问题的基本示例。让我们创建一个包含整数的树:

class IntegerNode extends Node{

    int value;

    public static void main(String[]args){

        IntegerNode root = new IntegerNode();
        int total = 0;

        for(IntegerNode child : root){  /* Compiler error, says that the
            iterator returns Iterator<Node> and not Iterator<IntegerNode>*/
            total+=child.value;
        }

        System.out.println(total);
    }

}

有没有一种简单的方法可以解决这个问题,而无需将Node类中的iterator()方法复制到IntegerNode类中?

1 个答案:

答案 0 :(得分:1)

我认为以下内容可行(未经过测试,因此不是100%确定):

class Node<T extends Node<T>> {
    public Iterator<T> iterator(){
        // basic tree traversal iterator
    }  
}

class IntegerNode extends Node<IntegerNode> {
    public static void main(String[]args) {
        IntegerNode root = new IntegerNode();
        int total = 0;
        for(IntegerNode child : root){  
            total += child.value;
        }

        System.out.println(total);
    }
}

这基本上是准标准inheritable builder pattern的扩展。