【问题标题】:Collections sort/binarysearch method集合排序/二进制搜索方法
【发布时间】:2020-11-05 19:37:16
【问题描述】:

我有一个关于 Collections API 二进制搜索和排序方法声明的查询。 binarySearch 中的 list 参数有上限通配符使用。 但是sort 方法中的list 参数不使用上限通配符。为什么这些不同?

对于sortlist 不使用上限通配符。

static <T> void sort(List<T> list, Comparator<? super T> c)

对于binarySearchlist 使用上限通配符。

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

我想知道如果sort 方法中不需要上限,为什么这里需要上限。

【问题讨论】:

  • binarySearch() 只需要从传递的List 中读取,而sort() 需要交换元素,因此需要从List 中读取和写入

标签: java generics


【解决方案1】:

这是因为当您拥有List&lt;? extends T&gt; 时,您无法向其中添加元素或从中删除元素,因为您不知道该列表中元素的类型。它可能只是T,也可能是Object,或者介于两者之间的T 的任何超类。请参阅Java Generic with ArrayList&lt;? extends A&gt; add element 了解更多信息。

正如@Lino - Vote don't say Thanks 所说的abovebinarySearch 没问题,因为它不必从给定列表中添加或删除元素 - 只要比较器可以比较每个元素,它就很高兴。但是,sort 确实需要移动元素,因此它需要列表是已知类型。

这并不意味着它实际上被利用了:java.util.Collections.javasources (OpenJDK 8)

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2014-07-15
    • 2020-06-20
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多