如何修改循环链表增量方法使其支持Pair类型元素
问题根因
当前的IncrementList方法默认泛型E的实例都存在doubleValue()方法,该逻辑仅适用于Number子类(比如Double),你自定义的Pair类没有该方法,运行时自然会抛出方法不存在或类型转换异常。
推荐解决方案(策略模式,扩展性最优)
该方案无需修改现有链表核心逻辑,后续新增任意类型都可直接适配,符合开闭原则。
- 首先定义加法规则的函数式接口(Java 8+也可以直接使用内置的
BinaryOperator<E>)
@FunctionalInterface public interface AddOperation<E> { E add(E original, E delta); }
- 修改
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); } }
- 适配两种元素类型的调用方式
- 针对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
相关产品推荐
相关产品推荐

