我很困惑。我无法将外部类的实例变量Node first分配给内部类的实例变数Node current。编译器抱怨存在不兼容的类型。如果我应用cast,它会起作用。这里发生了什么。
import java.util.*;
import java.lang.Iterable;
class Bag<Item> implements Iterable<Item> {
private class Node<Item> {
private Item item;
private Node<Item> next;
}
private Node<Item> first;
private int size;
public Bag() {
first = null;
size = 0;
}
public void add(Item item) {
Node<Item> oldNode = first;
Node<Item> newNode = new Node<>();
newNode.item = item;
newNode.next = oldNode;
first = newNode;
size++;
}
public boolean isEmpty() { return first == null; }
public int getSize() { return size; }
public Iterator<Item> iterator() {
return new ListIterator<Item>(first);
}
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
public ListIterator(Node<Item> node) {
// Error is here Error:(65, 23) java: incompatible types: Bag<Item>.Node<Item>
//cannot be converted to Bag<Item>.Node<Item>
// current and first are of the same type (Node<Item>).
// What is the problem, why shall I apply when the types are the same.
current = first;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
@Override
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
public String toString() {
StringBuilder s = new StringBuilder();
Iterator<Item> it = iterator();
while (it.hasNext())
s.append(it.next() + " ");
return s.toString();
}
}
public class Main {
public static void main(String[] args) {
int data[] = new int[5];
Bag<Integer> bag = new Bag<>();
for (int i = 0; i < data.length; i++)
data[i] = new Random().nextInt(1000);
//Arrays.sort(data);
System.out.println(Arrays.toString(data));
for (int i = 0; i < data.length; i++)
bag.add(data[i]);
System.out.println( "Size: " + bag.getSize() );
System.out.println( bag );
}
}
更改
private class Node<Item> {
private class ListIterator<Item> implements Iterator<Item> {
至
private class Node {
private class ListIterator implements Iterator<Item> {