我有一个通用的抽象类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>>()
答案 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>
,以允许BinarySearchTree
为NGram
:
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
。