我已经实现了一个红黑树(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);
}
有人可以告诉我这是怎么回事吗?
答案 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对象中使用的两种类型。