Mein Compiler ist JDK 6.0_65 und folgenden sind meine Codes (Deque.java):Warum funktioniert die Verwendung von generic für eine innere Klasse in Java nicht?
import java.util.Iterator;
public class Deque<Item> implements Iterable<Item> {
private Node first;
private Node last;
private class Node {
Item value;
Node next;
}
public Deque(){} // construct an empty deque
public Iterator<Item> iterator() {
// return an iterator over items in order from front to end
return new DequeIterator<Item>();
}
private class DequeIterator<Item> implements Iterator<Item> {
private Node current = first;
public boolean hasNext() {
return current.next != null;
}
public Item next() {
Item item = current.value;
current = current.next;
return item;
}
public void remove() {}
}
public static void main(String[] args) {
// unit testing
Deque<Integer> dq = new Deque<Integer>();
}
}
Im Außenbereich:
public class Deque<Item> implements Iterable<Item> {
verwendet wird.
Und im Innenbereich:
private class DequeIterator<Item> implements Iterator<Item> {
verwendet wird.
Im Rahmen von DequeIterator
. Ich habe erwartet, dass der local-scope (inner-class-scope) Item
den Class-scope Item
von Deque<Item>
abschirmen wird.
jedoch während der ersten Stufe Kompilieren javac
einen Fehler wie diese werfen:
Deque.java:2: error: incompatible types
Item item = current.value;
^
required: Item#2
found: Item#1
where Item#1,Item#2 are type-variables:
Item#1 extends Object declared in class Deque
Item#2 extends Object declared in class Deque.DequeIterator
Es sagt Item#2
und Item#1
inkompatible Typen ist, die mir ziemlich verwirrend aussieht, weil ich den Typ-Parameter Item
in DequeIterator
bestanden haben mit new DequeIterator<Item>()
.
Hat jemand eine Ahnung davon?
'Deque' ist ein Klassenname (na ja, eine Schnittstelle), die bereits durch das JDK verwendet ; es ist keine sehr gute Idee, das wiederzuverwenden ... – fge
Genauso wie Node nicht mit (einem neuen) Item parametrisiert wird, darf hier kein neues Item eingefügt oder umbenannt werden. Entfernen Sie das '- ' von DequeueIterator dort. –