Java BinaryTree需要另一个实现Comparable not working的Comparable子类的Comparable

Java BinaryTree需要另一个实现Comparable not working的Comparable子类的Comparable,java,generics,comparable,Java,Generics,Comparable,我有一个通用的抽象类,BString,它期望它的一种类型实现Comparable。另一个类,NGram扩展了BString,将String作为可比较的类型传递。最后一个类,BinarySearchTree需要扩展可比较的键 为什么我不能用NGram作为键类型创建BinarySearchTree?我已经包括了下面的类声明,并且注意到,虽然BString覆盖了compareTo,NGram没有覆盖 当我实际创建BinarySearchTree时,正如代码的最后一行一样,我收到了以下消息: 绑定不匹配

我有一个通用的抽象类,
BString
,它期望它的一种类型实现
Comparable
。另一个类,
NGram
扩展了
BString
,将
String
作为可比较的类型传递。最后一个类,
BinarySearchTree
需要扩展
可比较的键

为什么我不能用
NGram
作为键类型创建
BinarySearchTree
?我已经包括了下面的类声明,并且注意到,虽然
BString
覆盖了
compareTo
NGram
没有覆盖

当我实际创建
BinarySearchTree
时,正如代码的最后一行一样,我收到了以下消息:

绑定不匹配:类型
NGram
不是类型
BinarySearchTree

下面是代码

public abstract class BString<Alphabet extends Comparable<Alphabet>> implements Iterable<Alphabet>, Comparable<BString<Alphabet>> {
protected FixedSizeFIFOWorkList<Alphabet> str;

}
public BString(Alphabet[] str) {
    this.str = new CircularArrayFIFOQueue<Alphabet>(str.length);
    for (int i = 0; i < str.length; i++) {
        this.str.add(str[i]);
    }
}

public class NGram extends BString<String> {
    public NGram(String[] str) {
        super(str);
    }
}

public class BinarySearchTree<K extends Comparable<K>, V>
    extends ComparableDictionary<K, V> {
    // The root of the BST. Root is null if and only if the tree is empty.
    protected BSTNode root;

    /**
     * Create an empty binary search tree.
     */
    public BinarySearchTree() {
        super();
        this.root = null;
    }
}

new BinarySearchTree<NGram,Dictionary<AlphabeticString, Integer>>()
公共抽象类BString实现了Iterable、Comparable{
受保护的FixedSizeFIFOWorkList str;
}
公共BString(字母[]str){
this.str=新的循环rayfifoqueue(str.length);
对于(int i=0;i
您收到此错误是因为您已声明:

BinarySearchTree<K extends Comparable<K>, V>

否则,请去掉
Comparable
,改用
Comparator
。请注意,如果没有上述更改,您可以在构建
二进制搜索树时将
BString
用作
K
,因为它实现了
Comparable
,您的类
NGram
实现了
Comparable
(继承自
BString
)。为了满足
BinarySearchTree
的类型参数
K
的边界要求,它需要实现
Comparable
。后者不是前者的子类型

本质的问题是,
BinarySearchTree
的要求太严格。为了比较两个
NGram
s,它不需要该类专门与自身进行比较。它足以与它自己的任何超类相媲美。确切地说,这个概念可以这样表达:

public class BinarySearchTree<K extends Comparable<? super K>, V>
        extends ComparableDictionary<K, V> // ...

公共类BinarySearchTreeSence
NGram
没有实现
Comparable
,为什么你会惊讶于它不能在
BinarySearchTree
中用作
K
,在
BinarySearchTree
中它被绑定为
K extensed Comparable
?@Andreas,这是由于上一篇文章的缘故。评论(还没有回答)是否表明它将被允许?否。建议
NGram实现可比
,而不是
NGram实现可比
public class BinarySearchTree<K extends Comparable<? super K>, V>
        extends ComparableDictionary<K, V> // ...