java中的通用迭代器实现

时间:2011-12-15 13:26:21

标签: java generics iterator

我有以下设计: 我有一个抽象类Instance, 我有一个Library课,它扩展了Instance和 我有一个类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;
    }
}

Node

的位置
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;
    }   
}

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

  

类型不匹配 - 无法从实例转换为T.

此代码有什么问题?

2 个答案:

答案 0 :(得分:4)

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

Java Generics教程解释了它:http://docs.oracle.com/javase/tutorial/extra/generics/subtype.html

此外,在您的List<T>课程中,您应该使用IteratorListIteratorIterator<T>ListIterator<T>指定为通用,否则编译器会赢得'能够正确处理泛型。您的Node引用也必须是通用的:Node<T>

因此你应该使用

private Node<T> current;

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

当你使用普通类的原始类型时,编译器通常会警告你。

答案 1 :(得分:1)

没有人注意到这个错误:

public boolean hasNext() {
    if(current==null)
        return false;
    return false;
}

这是一个不变的。除非我遗漏了某些内容,否则迭代器将很快返回0个元素!