2013-05-06 63 views
0

我有問題與Java泛型。 當我從迭代器使用next()時,它不會返回我實例化的同一類型的對象。所以我收到一個不兼容的類型錯誤。 任何人都可以幫忙嗎?正確使用java泛型?

我編譯鏈接列表類時也收到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(); 
+0

你確定你不是使用原始類型(例如的普通'LinkedList'而不是LinkedList的'')在你的代碼的任何地方?這將是你所描述內容的可能解釋。請顯示你正在調用'next'的代碼,哪裏出錯。 – 2013-05-06 03:13:58

+0

'私人節點當前;'應該'私人節點當前;'? – 2013-05-06 03:18:35

回答

2

Iterator is a generic interface,但你的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 
    } 
} 
+0

更改迭代器後,我仍然遇到同樣的問題。 – user2353235 2013-05-06 03:38:01

+0

除了不執行'remove()'的迭代器,基本代碼編譯對我來說很好。 http://ideone.com/OTYxvP – 2013-05-06 03:43:12

+0

如果他做了後者,他也應該讓'ListIterator'不是內部類 – newacct 2013-05-06 06:57:53

0

你能張貼代碼,告訴你如何使用它?

確保當您使用ListIterator類,你LinkedList<Something>.ListIterator泛型化了。否則,類型爲LinkedList.ListIterator的迭代器將是原始類型,其next()將返回Object

也不要參數ListIterator。否則,它會影響外部類的類型變量。內部(非靜態)類可以使用外部類的類型變量。此外,如果你這樣做,你將不得不做LinkedList<Something>.ListIterator<Something>使其一致;你甚至不能執行LinkedList.ListIterator<Something>,因爲你不能給一個原始類型的內部類賦予泛型參數。

+0

啊Thakyou兩個傢伙!它需要是 **迭代器ITER = unsorted.iterator(); **的 代替 **迭代器ITER = unsorted.iterator(); ** – user2353235 2013-05-06 03:56:36