Java 为什么Arrays.binarySearch(对象[],对象)接受对象参数?
方法Java 为什么Arrays.binarySearch(对象[],对象)接受对象参数?,java,arrays,comparable,Java,Arrays,Comparable,方法 public static int binarySearch(Object[] a, Object key) 在其实现中,Arrays类的元素在binarySearch算法之后通过数组参数a进行导航,并将a的元素转换为Comparable并调用compareTo(key),直到找到匹配项或用尽可能 但是,如果该方法总是将元素强制转换为Comparable,并且如果遇到未实现Comparable的元素,则会抛出ClassCastException,我会被实现难住,API用户是否更清楚,该
public static int binarySearch(Object[] a, Object key)
在其实现中,Arrays类的元素在binarySearch算法之后通过数组参数a
进行导航,并将a
的元素转换为Comparable
并调用compareTo(key)
,直到找到匹配项或用尽可能
但是,如果该方法总是将元素强制转换为Comparable
,并且如果遇到未实现Comparable
的元素,则会抛出ClassCastException
,我会被实现难住,API用户是否更清楚,该方法将只考虑数组元素的比较器而不考虑键的比较器,如果在数组类型与Comparable不兼容的情况下进行调用,则可以防止编译,从而更简单,如果方法定义为
public static int binarySearch(Comparable[] a, Object key)
??将第一个参数定义为对象数组的优点是什么
编辑我只是在发布了问题并得到了回答后才看到这一点,但这里有一个相关帖子:他们指出,如果该方法采用了参数(可比[],Object),则在没有“重新分配”的情况下,不可能将Object[]类型的数组传递给该方法这也很昂贵。如果该方法实现为
public static int binarySearch(Comparable[] a, Comparable key)
但是,密钥必须是可比较的,否则您如何知道何时找到要查找的元素
我认为这可以归结为这样一种观点,即在这种情况下,所有东西都需要具有可比性是合乎逻辑的。我认为最好的声明实际上应该是通用声明:
public static <T extends Comparable<? super T>> int binarySearch(T[] a, T key)
公共静态请参阅。问题是,这将导致声明为type Object[]的数组出现问题,即使它们只包含可比较的对象。您可能无意中证明了我的观点,即它不是直观的。关键不必具有可比性。实现只执行数组元素的compareTo方法。永远不会查询该键。除非隐式检查是否通过哈希代码找到它,否则如何不需要该键是可比较的?它调用compareTo键,因此该键几乎必须是可比较的。它应该是调用compareTo最有可能的可比较类型。您关于“最有可能”的说法是正确的。但是,正在执行数组元素的比较器,执行的方法是compareTo,签名是compareTo(to)而不是compareTo(compareTo)。您可以创建一个可比较的类WhizBang,它可以将自己与一本书、一个CelestialBeing、一个Boolean、一个BeyondComparable进行比较,无论您想要什么。正确,但它们不必具有可比较的is-a关系。假设您有一个书籍数组和一个用于输入作者姓名的字符串键,并且您想知道在书籍数组中的何处可以找到Millie Smith的书籍。字符串不是书,字符串是最终的,虽然它是可比较的,但它只知道如何将自己与另一个字符串进行比较。你可以用一种不可比较的颜色做同样的事情,然后在你的书中进行二进制搜索,查找蓝皮书的起源。