猿问

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

我有一个通用抽象类 ,BString它期望其类型之一实现Comparable. 另一个类NGramextends作为可比类型BString传递。String最后一堂课,BinarySearchTree需要扩展的键Comparable

为什么我无法创建一个BinarySearchTreewithNGram作为键类型?我在下面包含了类声明,请注意虽然BString覆盖了compareToNGram但没有。

当我实际创建 时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>>()


陪伴而非守候
浏览 120回答 2
2回答

慕婉清6462132

您收到此错误是因为您已声明:BinarySearchTree<K&nbsp;extends&nbsp;Comparable<K>,&nbsp;V>当您使用NGramas K 时,预计会实现Comparable<NGram>.&nbsp;由于它没有实现,因此Comparable<NGram>您会收到错误消息。编辑有关此问题和解决方法的更多详细信息:当超类实现时Comparable<SuperClass>,子类不能再次实现Comparable<SubClass>。这将意味着子类两次实现相同的通用类型。Java不允许。Comparable<SuperClass>解决方法是也在子类中实现。在方法实现中,检查子类类型并进行处理。最好不要实现 `Comparable 你有一个类层次结构。相反,使用比较器。因此,要在当前情况下解决您的问题,请声明BinarySearchTree以下方式以允许NGramas&nbsp;K:BinarySearchTree<K&nbsp;extends&nbsp;Comparable<?&nbsp;super&nbsp;K>,&nbsp;V>否则,摆脱Comparable并改用Comparator。请注意,如果没有上述更改,您可以在构建时使用BStringas因为它实现了.KBinarySearchTreeComparable<BString>

幕布斯7119047

您的类NGram实现Comparable<BString<Alphabet>>(继承自BString)。为了满足 的BinarySearchTree类型参数的边界要求K,它需要实现Comparable<NGram>,而不是。后者不是前者的子类型。本质问题是 的BinarySearchTree要求过于严格。为了比较两个NGrams,它不需要那个类专门与它自己进行比较。它足以与它自己的任何超类相媲美。准确地说,这个概念可以这样表达:public&nbsp;class&nbsp;BinarySearchTree<K&nbsp;extends&nbsp;Comparable<?&nbsp;super&nbsp;K>,&nbsp;V>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;ComparableDictionary<K,&nbsp;V>&nbsp;//&nbsp;...当然,这ComparableDictionary也可能需要放松。
随时随地看视频慕课网APP

相关分类

Java
我要回答