java - java中的通用迭代器实现

标签 java generics iterator

我有以下设计: 我有一个抽象类实例, 我有一个扩展 Instance 的类 Library 和 我有一个类 File 也扩展了 Instance

我创建了自己的链表实现,其定义如下:

public class List<T extends Instance> implements Iterable {
    //some other code here

     public Iterator iterator(){
         return new ListIterator(this);

}

现在我已经创建了一个类

public class ListIterator<T extends Instance> implements Iterator<T> {
    private List thisList;
    private Node current;

    public ListIterator(List l){
        thisList=l;
        current=thisList.head.next;
    }
    @Override
    public boolean hasNext() {
        if(current==null)
            return false;
        return false;
    }

    @Override
    public T next() {
        Node temp=current;
        current=current.next;
        return temp.data;
    }
}

节点在哪里

public class Node<T extends Instance> {
    public Node<T> next;
    public Node<T> prev;
    public T data;

    public Node(T data,Node prev, Node next){
        this.data=data;
        this.prev=prev;
        this.next=next;
    }   
}

所以我的问题如下: return temp.data 行出现错误:

Type mismatch - cannot convert from Instance to T.

这段代码有什么问题?

最佳答案

我想说Node.data是对 Instance 的引用目的?如果是这种情况,编译器将无法自动更改 InstanceT ,因为即使 TInstance对象 ( T extends Instance ),任何给定的 Instance可能不是T .

Java 泛型教程对此进行了解释:http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html

此外,在您的 List<T> 中类,您应该指定 IteratorListIterator作为通用使用 Iterator<T>ListIterator<T> ,否则编译器将无法正确处理泛型。您的Node引用也需要是通用的:Node<T>

因此你应该使用

private Node<T> current;

public T next() {
    Node<T> temp=current;
    current=current.next;
    return temp.data;
}

当您对泛型类使用原始类型时,编译器通常会警告您。

关于java - java中的通用迭代器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520821/

相关文章:

java - 使用 sed 搜索并替换

java - 在数组中初始化数组

c# - 如何在泛型方法中比较两个值?

c++ - 有没有办法将 std::stack<pointer> 转换为 std::stack<const pointer>?

c++ - 如何在删除元素时防止重新散列 std::unordered_map?

java - Spring mvc : java. lang.AbstractMethodError

java - 如何避免使用实现多个接口(interface)的类来破坏 Liskov 替换原则?

scala - 当泛型与无界通配符一起使用时,不考虑类型参数绑定(bind)

有界通配符的 Java 泛型行为

javascript - 如何在 JavaScript 中使自定义迭代器接口(interface)可迭代