You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让继承Node的Column类实现Iterable<Column>?

解决Dancing Links中Column类的Iterable实现问题

针对你遇到的Node已实现Iterable<Node>,但子类Column无法实现Iterable<Column>的问题,核心原因是Java泛型的擦除机制和接口实现规则:同一个类不能重复实现擦除后相同的接口(Iterable<Node>和Iterable<Column>擦除后都是Iterable),且子类方法的返回类型不能与父类的泛型方法返回类型冲突。

下面提供两种可行的解决方案:

方案一:泛化Node类(推荐)

将Node改为泛型类,让子类指定自身作为迭代类型,从根源上统一迭代器的类型。

代码实现

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Node<T extends Node<T>> implements Iterable<T> {
    protected T left, right, up, down;
    protected Column column; // 保留列引用(如果需要)

    // 四向链表核心操作示例
    public void linkRight(T node) {
        node.right = (T) this.right;
        node.left = (T) this;
        this.right.left = node;
        this.right = node;
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            private T current = (T) Node.this;
            private boolean started = false;

            @Override
            public boolean hasNext() {
                return !started || current != Node.this;
            }

            @Override
            public T next() {
                if (!hasNext()) throw new NoSuchElementException();
                if (!started) {
                    started = true;
                } else {
                    current = current.right;
                }
                return current;
            }
        };
    }
}

public class Column extends Node<Column> {
    public int size; // Column特有的属性:列中节点数量

    // Column特有的方法示例:添加行节点
    public void addRow(Node<?> rowNode) {
        // 实现行节点与列的关联逻辑
        rowNode.up = this.up;
        rowNode.down = this;
        this.up.down = rowNode;
        this.up = rowNode;
        rowNode.column = this;
        size++;
    }
}

优势

  • 完全符合Dancing Links的继承设计(Column是特殊的Node)
  • 迭代器天然返回Column类型,增强for循环可直接使用:
    Column root = ...;
    for (Column col : root) {
        // 处理列逻辑
    }
    
  • 泛型设计具备扩展性,后续若新增Node子类,可直接指定自身迭代类型

方案二:给Column添加专属迭代方法(最小改动)

如果不想修改原有Node类的结构,可以在Column中新增一个返回Iterable<Column>的方法,绕开接口冲突问题。

代码实现

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Node implements Iterable<Node> {
    protected Node left, right, up, down;
    protected Column column;

    @Override
    public Iterator<Node> iterator() {
        // 原有Node迭代器实现
        return new Iterator<Node>() {
            private Node current = Node.this;
            private boolean started = false;

            @Override
            public boolean hasNext() {
                return !started || current != Node.this;
            }

            @Override
            public Node next() {
                if (!hasNext()) throw new NoSuchElementException();
                if (!started) started = true;
                else current = current.right;
                return current;
            }
        };
    }
}

public class Column extends Node {
    public int size;

    // 返回Column类型的Iterable
    public Iterable<Column> columns() {
        return () -> new Iterator<Column>() {
            private Column current = Column.this;
            private boolean started = false;

            @Override
            public boolean hasNext() {
                return !started || current != Column.this;
            }

            @Override
            public Column next() {
                if (!hasNext()) throw new NoSuchElementException();
                if (!started) {
                    started = true;
                } else {
                    current = (Column) current.right;
                }
                return current;
            }
        };
    }
}

使用方式

Column root = ...;
for (Column col : root.columns()) {
    // 处理列逻辑
}

优势

  • 无需修改现有Node类的代码,适合对现有结构改动最小的场景
  • 避免泛型带来的复杂度,快速解决类型转换问题

为什么原有方案不可行?

  1. 接口冲突:Java泛型擦除后,Iterable<Node>和Iterable<Column>都会变成Iterable,一个类不能重复实现同一个接口
  2. 返回类型不兼容:Iterator<Column>不是Iterator<Node>的子类型(泛型是不变的),因此子类无法重写父类的iterator()方法返回Iterator<Column>
  3. 类型转换问题:增强for循环中,父类迭代器返回的Node无法自动转换为Column,会触发编译错误

内容的提问来源于stack exchange,提问作者Wesley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:55:17