首页 > 解决方案 > BinaryTree 期望 Comparable,另一个实现 Comparable 的子类不起作用

问题描述

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

为什么我无法创建BinarySearchTreewithNGram作为键类型?我在下面包含了类声明,并注意虽然BStringoverrides 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>>()

标签: javagenericscomparable

解决方案


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

BinarySearchTree<K extends Comparable<K>, V>

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

编辑

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

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

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

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

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

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


推荐阅读