我正在做一项要求我实现跳过列表和二叉搜索树的任务。我也应该为每个数据结构实现迭代器。
跳过列表和二叉搜索树使用泛型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讨厌它。任何人都可以用虚拟术语解释它吗?我试过“打字”这个方法,但它给了我更多的错误。
答案 0 :(得分:0)
1。不能保证两个?
通配符属于同一类型。如果是,?
将是一个废话,因为这就是为什么它们:代表一个未知类型。
2。查看应转换的类型。 '捕获#15的......'和'捕获#16的......'似乎是两个不同的东西。
答案 1 :(得分:0)
您认为java中有多少个问号?
每次出现都代表一种未知类型,因此编译器必须假设它们都是不同的。
给你的“不关心”输入一个名字,即使它没有约束。