【问题标题】:Eclipse type mismatch errors on same wildcard同一通配符上的 Eclipse 类型不匹配错误
【发布时间】: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];
            }
        }
    }
}

我的问题: 撇开代码的正确性不谈,当我尝试让两个 SkiplistMapSkiplistMapNode 对象相互指向时,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


【解决方案1】:

1. 不能保证两个? 通配符是同一类型。如果是这样,? 将是无稽之谈,因为这就是它们的原因:用于表示未知类型。
2.查看应该转换的类型。 'Capture#15 of ...' 和 'Capture#16 of ...' 似乎是两个不同的东西。

【讨论】:

    【解决方案2】:

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

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

    为您的“无关”类型命名,即使它没有任何限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2015-04-28
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2013-01-16
      • 2018-06-08
      相关资源
      最近更新 更多