方法
public static int binarySearch(Object[] a, Object key)
的Arrays类在其实现中按照binarySearch算法导航数组参数a
,并将a
的元素转换为Comparable
并调用compareTo(key)
,直到它为止找到匹配或耗尽可能性。
我对实现感到困惑,但是如果情况是该方法总是将元素强制转换为Comparable
,并且如果它遇到一个没有实现的元素,则会抛出ClassCastException
Comparable
,如果API用户不清楚该方法只考虑数组元素的比较器而不是密钥的比较器,那么通过防止进行调用的编译会更加万无一失其中数组的类型与Comparable不兼容,如果方法定义为
public static int binarySearch(Comparable[] a, Object key)
?将第一个参数定义为Object数组有什么好处?
编辑我在发布问题之后才看到这个问题并且已经回答但是这里有相关的帖子:Why does Arrays.sort take Object[] rather than Comparable[]?他们声明如果方法采用参数(可比较) [],Object)如果没有“重新分配”也不可能将Object []类型的数组传递给该方法,这也很昂贵。
答案 0 :(得分:2)
我认为最好的声明实际上是通用声明:
public static <T extends Comparable<? super T>> int binarySearch(T[] a, T key)
我的猜测是,简单地说,此方法是使用Object
在早期Java版本中创建的,并且由于向后兼容性而无法更改。这种情况也发生在其他各个地方:带有toString()
和Cloneable
的数组是两个值得注意的例子。
答案 1 :(得分:0)
如果将方法实现为
,也许会很好public static int binarySearch(Comparable[] a, Comparable key)
键必须是可比较的,否则你怎么知道你找到你正在寻找的元素?
我认为这可以归结为这样的想法,即在这种情况下,所有事情都需要具有可比性。
答案 2 :(得分:0)
见Why does Arrays.sort take Object[] rather than Comparable[]?。问题是,这会导致声明为Object []类型的数组出现问题,即使它们只包含可比较数据。