谁能解释一下为什么我会收到此错误?
这是我使用双向链表实现的堆栈类:
import java.util.Iterator;
public class Stack<Item> implements Iterable<Item>{
private Node first;
private int N;
private class Node{
private Node next;
private Node prev;
private Item item;
}
public Iterator<Item> iterator(){
return new ReverseIterator<Item>();
}
private class ReverseIterator<Item> implements Iterator<Item>{
private Node x;
private ReverseIterator(){
if (first != null)
x = first.prev;
}
public boolean hasNext(){
return x != null;
}
public Item next(){
Item i = x.item;
x = x.prev;
return i;
}
public void remove(){
}
}
public void push(Item i){
if (isEmpty()){
first = new Node();
first.item = i;
first.next = first;
first.prev = first;
}
else{
Node x = new Node();
x.item = i;
x.next = first;
x.prev = first.prev;
first.prev.next = x;
first.prev = x;
}
N++;
}
public Item pop(){
assert !isEmpty() : "Stack is empty";
Item i = first.prev.item;
if (N == 1)
first = null;
else{
first.prev.prev.next = first;
first.prev = first.prev.prev;
}
N--;
return i;
}
public boolean isEmpty(){
return N == 0;
}
public int size(){
return N;
}
public static void main(String[] args){
}
}
编译器说 Item i = x.item;
有错误,预期项目,找到项目。解决方案是替换 ReverseIterator<Item>
与 ReverseIterator
。有人可以解释为什么我通过添加 <Item>
出现错误吗? ?
谢谢
最佳答案
仅仅因为您对类型变量使用相同的名称 ( Item
) 并不意味着它代表相同的泛型类型。
如果声明一个嵌套类N<T>
,在泛型类中 C<T>
,T
来自C<T>
有效地隐藏在 N<T>
的 body 之外。这与声明一个名为 x
的类级别字段的原理完全相同。并在该类中声明一个方法参数,也称为 x
。您最内部的声明范围向外部隐藏了任何内容。
如果ReverseIterator
如果是静态嵌套类,则您必须添加 <Item>
到它的声明,因为它的实例不会有 Stack<Item>
的封闭实例。即使在这种情况下不会进行任何隐藏,也会导致相同的错误。事实上,您需要将类型变量添加到 Node
也是如此。
关于java - 尝试在 Java 中实现 Iterable 时使用泛型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10957374/