我正在嘗試通過搜索舊元素并將其替換為新元素來更新節點的元素。但是有一個我不明白的錯誤。是什么導致我的代碼出現該錯誤,我該如何解決?錯誤;
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);
}
為了更好地理解,這里是 all 類;
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();
}
}
uj5u.com熱心網友回復:
這是因為您有兩個方法稱為update. 一個是update(E oldElement, E newElement)另一個是update(E e, int index)。
在Etype的情況下Integer,兩個方法簽名都匹配。update(E oldElement, E newElement)在這里被視為潛在的匹配項,因為原始25inccl.update(20, 25);可以自動裝箱為Integer。(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)不足以告訴編譯器您想要哪種方法。我認為在這種情況下,這是因為第一個引數需要裝箱,所以第二個引數仍然可以取消裝箱,但我不能肯定地說。
uj5u.com熱心網友回復:
這是因為您正在嘗試參考同一個物件的物件,計算機正在解釋同一個明膠中的明膠實體之類的東西,這對計算機來說是無稽之談并且模棱兩可,因為它是同一個物件,希望對您有所幫助.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318421.html
