为了账号安全,请及时绑定邮箱和手机立即绑定

BinaryTree 期望 Comparable,另一个实现 Comparable 的子类不起作用

BinaryTree 期望 Comparable,另一个实现 Comparable 的子类不起作用

陪伴而非守候 2023-05-10 13:19:23
我有一个通用抽象类 ,BString它期望其类型之一实现Comparable. 另一个类NGramextends作为可比类型BString传递。String最后一堂课,BinarySearchTree需要扩展的键Comparable。为什么我无法创建一个BinarySearchTreewithNGram作为键类型?我在下面包含了类声明,请注意虽然BString覆盖了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>>()
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您收到此错误是因为您已声明:

BinarySearchTree<K extends Comparable<K>, V>

当您使用NGramas K 时,预计会实现Comparable<NGram>. 由于它没有实现,因此Comparable<NGram>您会收到错误消息。

编辑

有关此问题和解决方法的更多详细信息:

当超类实现时Comparable<SuperClass>,子类不能再次实现Comparable<SubClass>。这将意味着子类两次实现相同的通用类型。Java不允许。

Comparable<SuperClass>解决方法是也在子类中实现。在方法实现中,检查子类类型并进行处理。最好不要实现 `Comparable 你有一个类层次结构。相反,使用比较器。

因此,要在当前情况下解决您的问题,请声明BinarySearchTree以下方式以允许NGramas K

BinarySearchTree<K extends Comparable<? super K>, V>

否则,摆脱Comparable并改用Comparator。请注意,如果没有上述更改,您可以在构建时使用BStringas因为它实现了.KBinarySearchTreeComparable<BString>


查看完整回答
反对 回复 2023-05-10
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您的类NGram实现Comparable<BString<Alphabet>>(继承自BString)。为了满足 的BinarySearchTree类型参数的边界要求K,它需要实现Comparable<NGram>,而不是。后者不是前者的子类型。

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

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

当然,这ComparableDictionary也可能需要放松。


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信