java - 尝试在 Java 中实现 Iterable 时使用泛型时出错

标签 java generics iterator iterable

谁能解释一下为什么我会收到此错误?

这是我使用双向链表实现的堆栈类:

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/

相关文章:

c++ - C++ 中的自定义迭代器

java - 创建jar时Gradle Android jar任务未将.java文件编译为.class文件

c# - 将 C# 字节转换为 Java 字节

java - 泛型类型的序列化 - GWT

swift - 有没有一些方法可以检查类是否是从泛型类型继承的?

java - 使用 Iterator.next() 避免 ConcurrentModificationException

java - FindBugs 警告 : Inefficient use of keySet iterator

java - 图像不是显示在 jar 中而是显示在编译器中?

java - 在maven中降级嵌入式tomcat版本

java - 为什么 Gson 序列化的是列表中的运行时类型,而不是指定的编译时类型?