我是泛型(以及 Java 和 Stack Overflow)的新手,我正在学习的教科书中有一点讨论了泛型二叉搜索树的实现(摘录如下)。
Comparable 接口是通用的,所以让我们考虑在搜索树中存储以下类型的元素:
<T 扩展可比性<T>>
这仍然会导致问题。假设 Dog 和 Cat 都是 Mammal 类的子类,并且 Mammal 类实现了 Comparable 接口。现在,如果我们创建一个存储 Mammal 对象的二叉搜索树,那么可以添加 Dog 和 Cat,但实际上并不能相互比较。因此,如果以这种特定方式使用此解决方案,则与使用 Comparable 的非泛型版本存在相同的问题。一个更全面的解决方案,虽然在智力上不那么令人满意,但是将泛型类型编写为:
< T 扩展可比性< ? 超级T>>
该声明将元素的可比性限制为 T 的任何超类。
所以我明白为什么类型参数需要是Comparable< T>
,但是这本书声称如果Mammal
s 的树包含尝试相互调用该compareTo()
方法的不同子类型,这可能会带来问题。好吧,如果树中Cat
and对象的引用类型是,那么它们不会调用's方法(being ),使其成为有效比较(仅在级别上)吗?Dog
Mammal
Mammal
compareTo()
Comparable< Mammal>
Mammal
我不明白有什么区别Comparable< ? super T>
,因为那不是一回事,除非如果Mammal
s 不是Comparable
,那么它会退回到Comparable
像 class 或其他东西这样的超Animal
类?
我可能遗漏了一些东西,比如一些令人讨厌的类型擦除后果或一些会导致比较无法像我想的那样工作的东西。