簡體   English   中英

這兩個Collections.binarySearch的通用簽名有何不同?

[英]How do these two generic signatures for Collections.binarySearch differ?

這是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的鍵,這些鍵的類型與某個類型的“低”類型相同,或者知道該類型如何比較T類型的實例或某個“上方”類型的實例。

第二個定義使您可以使用比較器來搜索值列表中類型T的鍵,該值的類型與類型T相同或“低於”類型的Comparator知道如何比較類型T的實例或某些“上方”類型的實例。

基本上,我不理解的是為什么為什么列表內容不被強制具有與鍵相同的類型?

第一組簽名較為籠統。 它適用於奇數邊緣情況,第二種情況會拒絕。 考慮以下情況

 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 (而不是彼此)具有可比性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM