Collections.binarySearch的这两个通用签名有何不同?

时间:2016-10-22 18:13:34

标签: java generics

以下是Java中Collections.binarySearch的定义:

static <T> int binarySearch(List<? extends Comparable<? super T> list, T key)
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

它们与以下定义(类似于Collections.sort)的区别如何:

static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key)
static <T> int binarySearch(List<T>, T x, Comparator<? super T>)

据我所知:

第一个定义允许您在值列表中搜索类型为T的键,其类型相同或者为&#34; lower&#34;某种类型知道如何比较T型或某些&#34;以上的实例&#34;类型。

第二个定义允许您在值列表中搜索类型为T的键,其类型相同或者&#34; lower&#34;比使用知道如何比较T型实例或某些&#34;以上&#34;的Comparator的类型T类型。

基本上,我不明白为什么列出的内容不能与密钥具有相同的类型?

1 个答案:

答案 0 :(得分:2)

第一组签名稍微一般。它适用于奇数边缘情况,第二种情况会拒绝。考虑

的情况
 import java.sql.Timestamp;  // extends Date implements Comparable<Date> (!)
 import java.util.Date;

 List<Timestamp> timestamps = ...;
 Date key = ...;
 int index = Collections.binarySearch(timestamps, key);

这适用于第一个签名,但在第二个签名下会被拒绝作为类型错误(您必须先将key转换为Timestamp

这可能是一件罕见的事情,但正如TimestampDate的示例所示,JDK中有这样的例子。

也许,有助于记住,binarySearch永远不需要将列表的元素与列表中的其他元素进行比较。它只是将列表的元素与给定的key进行比较,因此,有必要要求列表元素与key相当(并且不一定是彼此)。