为什么给出类型参数不在错误范围内

时间:2019-03-23 05:17:06

标签: java

我已经实现了一个红黑树(RBTree类),并且我试图使用该树来实现Map类(RBMap类)。

public class RBTree<T extends Comparable<T>> {
    private Node<T> root; // The root node of the tree

    public class Node<T extends Comparable<T>> {...}
}

我的想法是首先实现一个使用键和值的Pair类,并将其用作树中的节点。但是,即使我实现了Comparable Interface,它仍然会给出一个错误,如图所示。

public class RBMap<K,V> {

RBTree<Pair> _root; -> error: type parameter "RBMap.Pair" is not within its bound, should implement 'java.lang.Comparable<RBMap.Pair>'

public class Pair<K extends Comparable<K>, V> implements Comparable<Pair> {
    K key;
    V value;

    @Override
    public int compareTo(Pair o) {
        return this.key.compareTo((K) o.key);
    }

有人可以告诉我这是怎么回事吗?

1 个答案:

答案 0 :(得分:1)

如果您看到我之前的回答...对此表示抱歉。我的IDE包含了Apache的Pair的导入,所以我以为您以某种方式覆盖了它。然后,我意识到您是在自己定义一对。所以我的回答是错误的。

我认为这里的问题是,您正在尝试重新定义类型参数K和V。您已经具有由外部类定义的参数。所以内部Pair类已经被那些限定了,因为它是在外部类内部定义的。您绝对不希望重新定义相同的参数K和V。您可能想定义新的参数,例如Y和Z,但我认为您希望它们都是相同的两种类型。在这种情况下,我认为您只想要:

class RBTree<T extends Comparable<T>> {
    public class Node<T extends Comparable<T>> {
        T value;
    }
}

public class RBMap<K extends Comparable<K>, V> {

    RBTree<Pair> pair;

    public class Pair implements Comparable<Pair> {
        K key;
        V value;

        @Override
        public int compareTo(Pair o) {
            return this.key.compareTo((K) o.key);
        }
    }
}

如果不确定是否需要限定Pair上的类型,请考虑如果要在另一个类中使用Pair定义,该怎么做。您可以这样做:

    RBMap<Integer, Integer>.Pair _pair;

即使在RBMap类之外单独使用,您也已经提供了Pair对象中使用的两种类型。