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