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

时间:2019-07-31 21:18:51

标签: java generics comparable

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

为什么我无法创建以BinarySearchTree作为键类型的NGram?我在下面包括了类声明,并且请注意,尽管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 个答案:

答案 0 :(得分:1)

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

Uncaught Error: Template parse errors:
Can't bind to 'ng-href' since it isn't a known property of 'a'. ("      <span *ngIf="idx2 == 0">
                                                    <td mat-cell *matCellDef="let big_beast"> <a
                                                            [ERROR ->]ng-href="change://problem/{{big_beast[tempy]}}">{{big_beast[tempy]}} </a> 
                                                        </td>
                                "): ng:///AppModule/RadarInputComponent.html@109:15
    at syntaxError (compiler.js:2175)
    at TemplateParser.parse (compiler.js:11169)
    at JitCompiler._parseTemplate (compiler.js:25541)
    at JitCompiler._compileTemplate (compiler.js:25529)
    at compiler.js:25473
    at Set.forEach (<anonymous>)
    at JitCompiler._compileComponents (compiler.js:25473)
    at compiler.js:25386
    at Object.then (compiler.js:2166)
    at JitCompiler._compileModuleAndComponents (compiler.js:25385)

BinarySearchTree<K extends Comparable<K>, V> 用作K时,应实现NGram。由于它没有实现Comparable<NGram>,因此会出现错误。

修改

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

当超类实现Comparable<NGram>时,子类无法再次实现Comparable<SuperClass>。这将意味着子类两次实现相同的泛型类型。 Java不允许这样做。

解决方法也是在子类中实现Comparable<SubClass>。在方法实现中,检查子类类型并进行处理。最好不要在所有具有类层次结构的情况下实现`Comparable。而是使用Comparator。

因此,要解决当前情况下的问题,请以以下方式声明Comparable<SuperClass>,以允许BinarySearchTreeNGram

K

否则,请摆脱BinarySearchTree<K extends Comparable<? super K>, V> 并改用Comparable。请注意,如果不进行上述更改,则在构造Comparator时可以将BString用作K,因为它实现了BinarySearchTree

答案 1 :(得分:0)

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

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

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

当然,这可能也需要放宽ComparableDictionary