我的編譯器是JDK 6.0_65,和下面是我的代碼(Deque.java):在Java中,爲什麼在內部類上使用泛型不起作用?
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>();
}
}
在外部範圍:
public class Deque<Item> implements Iterable<Item> {
被使用。
而在內部範圍:
private class DequeIterator<Item> implements Iterator<Item> {
被使用。
在DequeIterator
的範圍內。我預計本地範圍(內部類範圍)Item
將影響類範圍Item
從Deque<Item>
。
然而,編譯階段期間,javac
會拋出這樣的錯誤:
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
它說Item#2
和Item#1
是不兼容的類型,它看起來相當混亂給我,因爲我已經通過了類型參數Item
到DequeIterator
使用new DequeIterator<Item>()
。
有沒有人有這方面的想法?
'Deque'是已經使用的JDK類名(當然,界面) ;這是不是一個很好的主意,重用... – fge
就像節點沒有參數化(新)項目不在這裏引入一個新的項目,或重命名它。從那裏的DequeueIterator中刪除'- '。 –