2013-11-21 36 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中有多少个问号?

每次出现都表示一个未知类型,所以编译器必须假定它们都是不同的。

给你的“不关心”类型一个名字,即使它没有限制。