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

如何修改循环链表增量方法使其支持Pair类型元素

问题根因

当前的IncrementList方法默认泛型E的实例都存在doubleValue()方法,该逻辑仅适用于Number子类(比如Double),你自定义的Pair类没有该方法,运行时自然会抛出方法不存在或类型转换异常。

推荐解决方案(策略模式,扩展性最优)

该方案无需修改现有链表核心逻辑,后续新增任意类型都可直接适配,符合开闭原则。

  1. 首先定义加法规则的函数式接口(Java 8+也可以直接使用内置的BinaryOperator<E>)
@FunctionalInterface
public interface AddOperation<E> {
    E add(E original, E delta);
}
  1. 修改IncrementList方法,将加法逻辑作为参数传入
public void IncrementList(E delta, AddOperation<E> addOp) {
    if (!isEmpty()) {
        Node<E> temp = current;
        do {
            temp.element = addOp.add(temp.element, delta);
            temp = temp.next;
        } while (temp != current);
    }
}
  1. 适配两种元素类型的调用方式
  • 针对Double类型链表:
// 示例:给所有元素加3.5
IncrementList(3.5, (origin, delta) -> origin + delta);
  • 针对Pair类型链表:
    首先给Pair类新增加法方法(也可以直接在调用时写逻辑,封装成方法复用性更高)
// Pair类新增代码
public Pair add(Pair other) {
    return new Pair(this.x + other.x, this.y + other.y);
}

调用方式:

// 示例:给所有Pair的x加1,y加2
IncrementList(new Pair(1, 2), Pair::add);

备选方案(不修改方法签名,仅适配当前两种类型)

如果你不想调整现有方法的入参结构,可以用类型分支判断实现,缺点是后续新增类型需要修改方法内部逻辑,违反开闭原则:

public void IncrementList(E e) {
    if (isEmpty()) {
        return;
    }
    Node<E> temp = current;
    do {
        if (temp.element instanceof Double && e instanceof Double) {
            Double res = ((Double) temp.element) + (Double) e;
            temp.element = (E) res;
        } else if (temp.element instanceof Pair && e instanceof Pair) {
            Pair origin = (Pair) temp.element;
            Pair delta = (Pair) e;
            Pair res = new Pair(origin.getX() + delta.getX(), origin.getY() + delta.getY());
            temp.element = (E) res;
        } else {
            throw new UnsupportedOperationException("当前元素类型不支持增量操作");
        }
        temp = temp.next;
    } while (temp != current);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:03