【发布时间】:2013-11-21 02:32:02
【问题描述】:
我正在做一个要求我实现跳过列表和二叉搜索树的作业。我还应该为每个数据结构实现迭代器。
跳过列表和二叉搜索树是使用泛型 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];
}
}
}
}
我的问题: 撇开代码的正确性不谈,当我尝试让两个 SkiplistMap 或 SkiplistMapNode 对象相互指向时,Eclipse 吓坏了,尖叫着说存在类型不匹配。它告诉我
Type mismatch: cannot convert from SkiplistMapNode<T,capture#16-of ?> to SkiplistMapNode<T,capture#15-of ?>
但我输入的是同一个问号,所以我不确定 Eclipse 为何讨厌它。任何人都可以用虚拟术语解释它吗?我试过“输入”这个方法,但它给了我更多的错误。
【问题讨论】:
-
“但是我输入的是同一个问号”——是的,但是那个问号代表“一些特定的、未知的类型”,所以两个问号(也称为通配符捕获)不是保证匹配。有关介绍,请参阅 the Java Tutorials article on wildcards。
-
您能告诉我们发生此错误的行吗? (可能还有一些周围的代码,如果它可能与问题相关 - 例如,如果它包含相关的变量声明)
标签: java eclipse generics wildcard