2 回答
TA贡献1804条经验 获得超2个赞
您收到此错误是因为您已声明:
BinarySearchTree<K extends Comparable<K>, V>
当您使用NGram
as K 时,预计会实现Comparable<NGram>
. 由于它没有实现,因此Comparable<NGram>
您会收到错误消息。
编辑
有关此问题和解决方法的更多详细信息:
当超类实现时Comparable<SuperClass>
,子类不能再次实现Comparable<SubClass>
。这将意味着子类两次实现相同的通用类型。Java不允许。
Comparable<SuperClass>
解决方法是也在子类中实现。在方法实现中,检查子类类型并进行处理。最好不要实现 `Comparable 你有一个类层次结构。相反,使用比较器。
因此,要在当前情况下解决您的问题,请声明BinarySearchTree
以下方式以允许NGram
as K
:
BinarySearchTree<K extends Comparable<? super K>, V>
否则,摆脱Comparable
并改用Comparator
。请注意,如果没有上述更改,您可以在构建时使用BString
as因为它实现了.K
BinarySearchTree
Comparable<BString>
TA贡献1794条经验 获得超8个赞
您的类NGram
实现Comparable<BString<Alphabet>>
(继承自BString
)。为了满足 的BinarySearchTree
类型参数的边界要求K
,它需要实现Comparable<NGram>
,而不是。后者不是前者的子类型。
本质问题是 的BinarySearchTree
要求过于严格。为了比较两个NGram
s,它不需要那个类专门与它自己进行比较。它足以与它自己的任何超类相媲美。准确地说,这个概念可以这样表达:
public class BinarySearchTree<K extends Comparable<? super K>, V> extends ComparableDictionary<K, V> // ...
当然,这ComparableDictionary
也可能需要放松。
添加回答
举报