当前位置: 首页 > 知识库问答 >
问题:

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

梁马鲁
2023-03-14

我想创建一个自定义的树数据结构,只有节点,我可以迭代他们。然后,我可以扩展这个类,并有非常基本的树

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类时,问题就来了。对于扩展类,继承的迭代器方法仍然返回节点迭代器,这意味着我每次都要强制转换。下面是我遇到的问题的一个基本示例。让我们建立一个包含整数的树:

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);
    }

}

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

共有1个答案

宋腾
2023-03-14

我认为以下将工作(未经测试,所以不是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);
    }
}

这基本上是准标准可继承构建器模式的扩展。

 类似资料:
  • 我试图为自己的泛型类编写自己的迭代器。我一直在看几个YouTube教程,在网上搜索。 IntelliJ指出的问题是,我不能像我试图的那样在迭代器类中使用getleft和getright,因为非静态方法不能从静态上下文中引用。我一直在研究静态和更多,但无法解决这个问题。我是完全走错了路,还是至少我的方法有点接近? 运行时: 我遇到了一个无休止的循环,打印5。因此,迭代器本身可以工作,但我的方法有一个

  • 问题内容: 假设我们需要使用一个名为“ BaseNode”的类来实现不同类型的树,从该类派生其他类型的Node,并且它假定具有一个自己类型的实例变量,通常看起来像这样: 现在,如果我要为具有更多成员的AVL树派生Node: 原始(&)节点成员仍然会类型我实施AVL树,其防止。谁能告诉我如何解决这一继承问题?谢谢! 问题答案: 解决方案1- 每次访问时,都将其转换为。您可以在其中编写访问器以使其更加

  • 问题内容: 我正在阅读另一个SO问题,即Swift do-try-catch语法。在他的回答中, rickster 为OP的自定义类创建了扩展。 Konrad77 评论说,这是“保持代码整洁的好方法。” 我尊重他们的知识,这使我相信我在自己的代码中遗漏了一点。 除了为我创建的类创建扩展之外,还有其他好处(除了整洁)还是原因?我可以将相同的功能直接放入类中。如果我是唯一使用该类的人,或者其他人将使用

  • 我正试图用三个额外的日期(时间戳)字段扩展扩展扩展名(新闻),并希望在(新闻)的fluidtemplate中调用这些字段。 我已经连线到目前为止,我可以看到我的后端额外的字段,而无需选择一个外部类型-我已经相应地修改了ext_tables.php,并可以保存数据。 现在,我试图在我的新闻流模板中使用这些字段,在我的Partials/List/Item中使用以下代码。html-{newsItem.d

  • 问题内容: 我偶然发现了对Java继承的好奇心,我希望您对此提出更好的想法: 假设两个接口A和A1 接口A1扩展了A 接口A具有返回泛型类型的方法。 通用类型将是。 现在的基本思想是将这种通用返回类型从接口A中更改 为 接口A1中的 一开始似乎很容易(不好的事情会在以后出现) 我们将接口A声明为 和接口A1一样 如您所见,我们被迫编写接口A本身,以允许使用基于泛型的“子类”覆盖它。(实际上,gen

  • 问题内容: Java是否可以让类扩展泛型,以便您可以将方法注入通过代码传递的任何类中?(或者是否有其他方法可以使用Java将方法注入或重写到现有类中?) 我所说的“扩展通用类型”是这样的(类“ Textended GameObject”属于游戏,可能不会更改,并且是未知的,因为它是在运行时(从其他mods)加载到游戏中的): onTick由GameEngine调用,通过这种方式,我可以将每个现有的