6

方法

public static int binarySearch(Object[] a, Object key) 

Arrays 类在其实现中通过二进制搜索算法之后的数组参数导航a,并将元素转换aComparable并调用compareTo(key),直到找到匹配项或用尽可能性。

但是,我对实现感到困惑,如果该方法总是将元素强制转换为Comparable,并且ClassCastException如果遇到未实现的元素还会抛出 a Comparable,那么 API 用户是否更清楚该方法将仅考虑数组元素的比较器而不考虑键的比较器,通过防止在数组类型与 Comparable 不兼容的情况下进行调用的编译来更加万无一失,并且在以下情况下也更有效地执行该方法被定义为

public static int binarySearch(Comparable[] a, Object key) 

? 将第一个参数定义为 Object 数组有什么好处?

编辑我只是在发布问题并且已经回答后才看到这个,但是这里有一个相关的帖子:为什么 Arrays.sort 采用 Object[] 而不是 Comparable[]?他们指出,如果该方法采用参数(Comparable[],Object),则无法在没有“重新分配”的情况下将 Object[] 类型的数组传递给该方法,这也很昂贵。

4

3 回答 3

2

我认为最好的声明实际上是一个通用的声明:

public static <T extends Comparable<? super T>> int binarySearch(T[] a, T key)

我的猜测是,简单地说,这个方法是在早期的 Java 版本中使用Objects 创建的,并且由于向后兼容的原因无法更改。这也发生在其他许多地方:带有toString()和的数组Cloneable是两个值得注意的例子。

于 2013-10-12T15:42:39.017 回答
0

如果该方法实现为

public static int binarySearch(Comparable[] a, Comparable key)

关键必须是 Comparable ,否则你怎么知道你什么时候找到了你要找的元素?

我认为归结为这样一种想法,即在这种情况下,一切都需要具有可比性是合乎逻辑的。

于 2013-10-12T15:34:29.867 回答
0

请参阅为什么 Arrays.sort 采用 Object[] 而不是 Comparable[]?. 问题是这会导致声明为 Object[] 类型的数组出现问题,即使它们只包含 Comparables。

于 2014-03-21T15:48:41.857 回答