java - BinaryTree 期望 Comparable,另一个实现 Comparable 的子类不起作用
问题描述
我有一个通用抽象类,BString
它期望它的一种类型实现Comparable
。另一个类NGram
extends ,作为可比较类型BString
传递。String
最后一个类,BinarySearchTree
需要扩展的键Comparable
。
为什么我无法创建BinarySearchTree
withNGram
作为键类型?我在下面包含了类声明,并注意虽然BString
overrides compareTo
,NGram
但没有。
当我去实际创建时BinarySearchTree
,如代码的最后一行,我收到以下消息:
有界不匹配:该类型
NGram
不是该类型的有界参数<K extends Comparable<K>>
的有效替代品BinarySearchTree<K,V>
下面是代码。
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>>()
解决方案
您收到此错误是因为您已声明:
BinarySearchTree<K extends Comparable<K>, V>
当您使用NGram
as K 时,预计会实现Comparable<NGram>
. 由于它没有实现,因此Comparable<NGram>
您会收到错误消息。
编辑
有关此问题和解决方法的更多详细信息:
当超类实现Comparable<SuperClass>
时,子类不能再实现Comparable<SubClass>
。这将意味着子类两次实现相同的通用类型。Java 不允许这样做。
解决方法也是Comparable<SuperClass>
在子类中实现。在方法实现中,检查子类类型并处理它。宁愿不实现 `Comparable 你有一个类层次结构。相反,使用比较器。
因此,要在当前情况下解决您的问题,请声明以下BinarySearchTree
方式以允许NGram
:K
BinarySearchTree<K extends Comparable<? super K>, V>
否则,摆脱Comparable
并Comparator
改用。请注意,如果没有上述更改,您可以在构建时使用BString
as ,因为它实现了.K
BinarySearchTree
Comparable<BString>
推荐阅读
- ios - 如何在 Storyboard 的堆栈视图中调整子视图的大小?
- sql - SQL迭代(循环)基于行分组列表的查询,并将每次迭代的结果合并到同一张表中
- google-chrome - 无法使用 MediaSource 在 Firefox 中重播 MP3,即使它在 Chrome 中工作
- r - 如何从R中列表中的循环中分配向量
- mysql - 查询中的问题以查找过去 xx 天内未对任何帖子发表评论的用户
- swiftui - 如何在父视图使用 IgnoringSafeArea() 时访问 safeArea 插图
- javascript - 为什么退出全屏模式后地址栏不显示?
- pandas - 计算列表中每个项目出现在 pandas 数据框列中的次数,用逗号分隔值
- css - 使用粘性标题制作整页滚动条控制表(仅限 CSS)
- java - 为什么 ArrayList 不插入一些值?