0

我在使用 java 泛型时遇到问题。当我从迭代器中使用 next() 时,它不会返回与我实例化它的类型相同的对象。所以我收到一个不兼容的类型错误。任何人都可以帮忙吗?

当我编译链表类时,我也会收到 Xlint 警告。

public class LinkedList<Type>
{

private Node<Type> sentinel = new Node<Type>();
private Node<Type> current;
private int modCount;

public LinkedList()
{
    // initialise instance variables
    sentinel.setNext(sentinel);
    sentinel.setPrev(sentinel);
    modCount = 0;
}
public void prepend(Type newData)
{
   Node<Type> newN = new Node<Type>(newData);
   Node<Type> temp;
   temp = sentinel.getPrev();
   sentinel.setPrev(newN);
   temp.setNext(newN);
   newN.setPrev(temp);
   newN.setNext(sentinel);           
   modCount++;
}


private class ListIterator implements Iterator
{
    private int curPos, expectedCount;
    private Node<Type> itNode;
    private ListIterator()
    {
        curPos =0;
        expectedCount = modCount;
        itNode = sentinel;
    }

    public boolean hasNext()
    {
        return (curPos < expectedCount);
    }

    public Type next()
    {
        if (modCount != expectedCount)
            throw new ConcurrentModificationException("Cannot mutate in context of iterator");
        if (!hasNext())
            throw new NoSuchElementException("There are no more elements");
        itNode = itNode.getNext();
        curPos++;
        current = itNode;
        return (itNode.getData());
    }
 }

}

这是创建列表并填充不同类型的形状后主类中发生错误的地方。

shape test;
Iterator iter = unsorted.iterator();
test = iter.next();
4

2 回答 2

2

Iterator是一个通用接口,但你ListIterator既不是通用的也不是参数化Iterator的。从制作ListIterator工具开始Iterator<Type>

private class ListIterator implements Iterator<Type> {
    // the rest should be fine
}

或制作ListIterator通用(更复杂):

private class ListIterator<T> implements Iterator<T>
{
    private int curPos, expectedCount;
    private Node<T> itNode;
    private ListIterator()
    {
        curPos = 0;
        expectedCount = modCount;
        itNode = sentinel;
    }

    public boolean hasNext()
    {
        return (curPos < expectedCount);
    }

    public T next()
    {
        // snip
    }
}
于 2013-05-06T03:20:00.873 回答
0

你能发布代码来展示你如何使用它吗?

确保在使用ListIterator该类时,使用LinkedList<Something>.ListIterator. 否则,类型的迭代器LinkedList.ListIterator将是原始类型,并且next()它将返回Object

也不要参数化ListIterator. 否则,它将遮蔽外部类上的类型变量。内部(非静态)类可以使用外部类的类型变量。此外,如果您这样做了,则LinkedList<Something>.ListIterator<Something>必须使其保持一致;你甚至不能这样做LinkedList.ListIterator<Something>,因为你不能给原始类型的内部类提供泛型参数。

于 2013-05-06T03:49:41.227 回答