为什么是泛型接口实现了Comparator接口不加泛型compare方法形参就只能使用Object

我正在尝试创建一个混合列表,使鼡二进制搜索树来实现各种功能.该类尝试实现List

这确保了E型在某种程度上具有可比性.然而问题在于List接口如何声明其抽象函数.例如:

通常,我会假设参数是可比较的,然后在树上使用递归查找方法,但因为参数是Object,我不能做出这个假设.

我试图通过执行以下操作来确保它是E类型:

但它没有鼡,给了我这个建议:

你的情况没有完美的答案.比较器之间存在一种冲突,正确使用由编译时泛型强制执行,而.contains()方法,其契约依赖于.equals(),它接受任何类型的对象(没有编译时)约束),其逻辑必须基于运行时信息. TreeSet也面临这个问题.

您的数据结构的整个点是查找是O(log n),因此您无法检查每个元素并进行检查;楿反,您必须通过使用比较器将给定值与元素进行比较来进入二叉搜索树.但由于给定元素是任何类型的对象,我们不知道比较器可以接受它.我認为最好的解决方案就是将其转换为E并假设您的比较器可以接受它.如果对象不是E的实例,比较器可能会以某种方式抛出ClassCastException,您可以让该异常传递給用户.

虽然这使得.contains()不那么通用,但它避免破坏Collection.contains()的契约,因为如果有人给我们一个对象,我们的比较器无法比较.contains(),那么正确的答案可能是真的,或者根據合同错误,但我们无法有效地确定;因此,我们不会返回可能出错的内容,而是抛出一个异常,这在合同中是允许的.

我要回帖

更多关于 什么是泛型接口 的文章

 

随机推荐