方法 update(Integer, Integer) 对于 CircularLinkedList<Integer> 类型是不明确的
The method update(Integer, Integer) is ambiguous for the type CircularLinkedList<Integer>
我正在尝试通过搜索旧元素并将其替换为新元素来更新节点的元素。但是有一个我不明白的错误。是什么导致我的代码出现该错误,我该如何解决?错误;
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 到 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)
不足以告诉编译器你想要哪个方法。 我假设在那种情况下是因为第一个参数受制于装箱,所以第二个参数仍然可以被拆箱,但我不能肯定地说。
我正在尝试通过搜索旧元素并将其替换为新元素来更新节点的元素。但是有一个我不明白的错误。是什么导致我的代码出现该错误,我该如何解决?错误;
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 到 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)
不足以告诉编译器你想要哪个方法。 我假设在那种情况下是因为第一个参数受制于装箱,所以第二个参数仍然可以被拆箱,但我不能肯定地说。