Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Arrays.binarySearch(对象[],对象)接受对象参数?_Java_Arrays_Comparable - Fatal编程技术网

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的书籍。字符串不是书,字符串是最终的,虽然它是可比较的,但它只知道如何将自己与另一个字符串进行比较。你可以用一种不可比较的颜色做同样的事情,然后在你的书中进行二进制搜索,查找蓝皮书的起源。