2013-11-21 38 views
0

我正在做一項任務,要求我實現跳過列表和二叉搜索樹。我也應該爲每個數據結構實現迭代器。同一通配符上的Eclipse類型不匹配錯誤

跳躍列表和二叉搜索樹使用泛型K和V.

public class SkiplistMap<K extends Comparable<K>,V> implements SortedMap<K,V> 
public class SkiplistMapNode<K extends Comparable<K>,V> 
public class BSTMap<K extends Comparable<K>,V> implements SortedMap<K,V> 
public class BSTMapNode<K extends Comparable<K>,V> 

的迭代器只能使用可比類型實現的,所以我插好?作爲不可比較的類型。

public class SkiplistMapIterator<T extends Comparable<T>> implements Iterator<T> { 

    SkiplistMap<T,?> list; 
    Queue<SkiplistMapNode<T,?>> queue; 
    int version; 

    public SkiplistMapIterator(SkiplistMap<T,?> sl){ 
     list = sl; 
     queue = new LinkedList<SkiplistMapNode<T,?>>(); 
     SkiplistMapNode<T,?> N = sl.getHead(); 
     while (N != null){ 
      queue.add(N); 
      N = N.getNext()[0]; 
     } 
     version = sl.getVersion(); 
    } 

    public void remove() throws UnsupportedOperationException{ 
     if (queue.isEmpty()) throw new UnsupportedOperationException("No element present"); 
     else { 
      T toRemove = queue.remove().getKey(); 
      SkiplistMapNode<T,?> N = list.getHead(); 
      while (N != null){ 
       if (N.getNext()[0].getKey().compareTo(toRemove) == 0){ 
        SkiplistMapNode<T,?> found = N.getNext()[0]; 
        for (int l = list.getLevel()-1; l >= 0; l--){ 
         N.getNext()[l] = N.getNext()[l].getNext()[l]; 
         found.getNext()[l] = null; 
        } 
        list.incVersion(); 
        break; 
       } 
       N = N.getNext()[0]; 
      } 
     } 
    } 
} 

我的問題:正確性代碼的一邊,當我試圖做兩個SkiplistMapSkiplistMapNode對象指向對方,Eclipse的怪胎尖叫有一個類型不匹配。它告訴我

Type mismatch: cannot convert from SkiplistMapNode<T,capture#16-of ?> to SkiplistMapNode<T,capture#15-of ?> 

但我輸入相同的問號,所以我不知道爲什麼Eclipse討厭它。任何人都可以用假詞解釋嗎?我試過「打字」的方法,但它給了我更多的錯誤。

+1

「但是我輸入相同的問號」 - 是的,但該問號代表「某些特定的未知類型」,所以兩個問號(也稱爲通配符捕獲)不能保證匹配。有關介紹,請參閱[關於通配符的Java教程文章](http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html)。 –

+0

你能告訴我們這個錯誤發生的地方嗎? (可能還有一些周圍的代碼,如果它可能與問題有關 - 例如它包含相關的變量聲明) – Marco13

回答

0

1.不能保證兩個?通配符是相同的類型。如果是這樣,?將是一個廢話,因爲這就是爲什麼他們是:代表一個未知的類型。
2.看看應該轉換的類型。 '捕捉#15​​ ...'和'捕捉#16 ...'似乎是兩回事。

0

你認爲在java中有多少個問號?

每次出現都表示一個未知類型,所以編譯器必須假定它們都是不同的。

給你的「不關心」類型一個名字,即使它沒有限制。