相同通配符上的Eclipse类型不匹配错误

时间:2013-11-21 02:32:03

标签: java eclipse generics wildcard

我正在做一项要求我实现跳过列表和二叉搜索树的任务。我也应该为每个数据结构实现迭代器。

跳过列表和二叉搜索树使用泛型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讨厌它。任何人都可以用虚拟术语解释它吗?我试过“打字”这个方法,但它给了我更多的错误。

2 个答案:

答案 0 :(得分:0)

1。不能保证两个?通配符属于同一类型。如果是,?将是一个废话,因为这就是为什么它们:代表一个未知类型。
2。查看应转换的类型。 '捕获#15的......'和'捕获#16的......'似乎是两个不同的东西。

答案 1 :(得分:0)

您认为java中有多少个问号?

每次出现都代表一种未知类型,因此编译器必须假设它们都是不同的。

给你的“不关心”输入一个名字,即使它没有约束。