java - update(Integer, Integer) 方法对于 CircularLinkedList<Integer> 类型不明确

标签 java linked-list singly-linked-list circular-list

我正在尝试通过搜索旧元素并将其替换为新元素来更新节点的元素。但有一个我不明白的错误。是什么导致我的代码出现该错误以及如何修复它?错误;

The method update(Integer, Integer) is ambiguous for the type CircularLinkedList<Integer>

`

public class MainClass {

public static void main(String[] args) {
    CircularLinkedList<Integer> ccl = new CircularLinkedList<>();
    ccl.append(10);
    ccl.append(20);
    ccl.append(30);
    ccl.append(40);
    ccl.append(50);
    ccl.append(71);
    ccl.update(20, 25);

    System.out.println(ccl);
    
    }

}

这是相关方法;

public void update(E oldElement, E newElement) {
    Node<E> temp = head;
    while (temp.getElement() != oldElement) {
        temp = temp.next;
    }
    temp.setElement(newElement);
}

这是为了更好地理解所有类(class);

public class CircularLinkedList<E> {

private static class Node<E> {
    private E element;
    private Node<E> next;

    public Node(E e, Node<E> n) {
        element = e;
        next = n;
    }

    public E getElement() {
        return element;
    }

    public void setElement(E e) {
        element = e;
    }

    public Node<E> getNext() {
        return next;
    }

    public void setNext(Node<E> n) {
        next = n;
    }
}

private Node<E> head;
private Node<E> tail;
private int size;

public CircularLinkedList() {
};

public void addToHead(E e) {
    Node<E> newHead = new Node<E>(e, head);
    head = newHead;
    tail.setNext(newHead);
    size++;
}

public void append(E e) {
    if (head == null) {
        head = new Node<E>(e, null);
        tail = head;
        size++;
        return;
    }

    Node<E> temp = head;
    while (temp != tail) {
        temp = temp.next;
    }
    Node<E> newNode = new Node<E>(e, null);
    temp.next = newNode;
    tail = newNode;
    tail.setNext(head);
    size++;
    return;
}

public void append(E e, int index) {
    if (index % size == 0) {
        addToHead(e);
    }
    if (index % size == 1) {
        append(e);
    }
    Node<E> temp = head;
    for (int i = 0; i < (index - 1) % size; i++) {
        temp = temp.next;
    }
    Node<E> newNodesNext = temp.next;
    temp.setNext(new Node<E>(e, newNodesNext));
    size++;
}

public void update(E oldElement, E newElement) {
    Node<E> temp = head;
    while (temp.getElement() != oldElement) {
        temp = temp.next;
    }
    temp.setElement(newElement);
}

public void update(E e, int index) {
    if (size == 0) {
        throw new RuntimeException("Can not update anything in a empty list.");
    }
    Node<E> temp = head;
    for (int i = 0; i < (index - 1) % size; i++) {
        temp = temp.next;
    }
    temp.setElement(e);
}

public void remove(E e) {
    Node<E> temp = head;
    while (temp.next.getElement() != e) {
        temp = temp.next;
    }
    Node<E> nodeToBeRemoved = temp.next;
    temp.setNext(temp.next.next);
    nodeToBeRemoved.setNext(null);
    size--;
}

public String toString() {
    StringBuilder sb = new StringBuilder();
    Node<E> temp = head;
    for (int i = 0; i < size; i++) {
        sb.append(temp.getElement()).append(", ");
        temp = temp.next;
    }
    return sb.toString();
}

}

最佳答案

这是因为您有两个名为 update 的方法。一个是update(E oldElement, E newElement),另一个是update(E e, int index)

如果 E 的类型为 Integer,则两个方法签名都匹配。 update(E oldElement, E newElement) 在这里被视为潜在的匹配,因为 ccl.update(20, 25); 中的原语 25 > 可以是auto-boxed整数。 (20 在两种方法中都会自动装箱)

解决方案是重命名您的方法之一。例如 update(E e, int index)updateAtIndex(E e, int index)

您还可以将第一个参数显式转换为Integer。这足以告诉编译器您想要哪种方法:ccl.update((Integer)20, 25);,在这种情况下update(E e, int index)将被召唤。

奇怪的是,仅将第二个参数转换为Integer不会工作,编译器仍然会给出“不明确的方法调用”错误。例如。 ccl.update(20, (Integer)25) 不足以告诉编译器您想要哪种方法。 我认为在这种情况下,这是因为第一个参数需要装箱,所以第二个参数仍然可以拆箱,但我不能肯定地说。

关于java - update(Integer, Integer) 方法对于 CircularLinkedList<Integer> 类型不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69587906/

相关文章:

c++ - 如何从未排序的链表中删除重复项

c++ - 如何删除链表中的特定节点?

java - 提供静态(默认)值的最佳方法

java - 如何修复 keytool 命令错误 (Linux)?

c - 在链表上插入一个新节点会创建一个新节点

c - 调用函数时出现不兼容指针类型错误

java - 吝啬的链接结构和节点?

c - 释放c中的单向链表

java - 如何使用 JEval 库评估 java 中的幂、根、阶乘函数?

java - Maven突然下载maven-clover2-plugin