![](/img/trans.png)
[英]Why equals() is there is Comparator but not in Comparable interface in Java
[英]Why Comparable and Comparator are consumers in PECS wildcard types in Java
在 Effective Java 中,在“使用有界通配符增加 API 靈活性”項中,在談到 PECS(producer-extends,consumer-super)的使用時,作者提到:
可比較對象始終是消費者,因此您通常應該使用 Comparable<? super T> 優先於 Comparable。 比較器也是如此; 因此,您通常應該使用 Comparator<? super T> 優先於 Comparator。
我不清楚為什么 Comparables 和 Comparators 被認為是消費者。
在討論 PECS 的主題之一中, 什么是 PECS(生產者擴展消費者超級)? ,消費者通常將 Collection 稱為某些泛型方法的參數。
而這里的 Comparable 只是一個接口。
任何人都可以分享一些見解嗎? 謝謝!
可以對接口Consumer<T>
和Supplier<T>
進行一個很好的類比( Supplier
類似於 Producer)。 Consumer<T>
是一個接收T
的 function ,而Supplier<T>
是一個返回T
的 function 。 請注意,我們談論的是方法簽名和返回類型,我們沒有談論方法的語義。 這是 PECS 的核心屬性:它獨立於語義,可以僅根據所使用方法的簽名和返回類型來確定。
查看Comparable<T>
和Comparator<T>
,我們發現它們都有方法( int compareTo(T)
和int compare(T, T)
),即消耗T
。
對於 collections,我們必須看看我們如何使用集合,即我們是使用生產者方法還是消費者方法:
T get(int)
,迭代器,...),列表為我們生成值,我們使用? extends T
? extends T
。add(T)
, addAll(Collection<T>)
, contains(T)
,...),我們調用消費方法,因此該方法是我們數據的消費者我們使用? super T
? super T
T
,既不使用... extends...
也不使用... super...
„ …我不清楚為什么 Comparables 和 Comparators 被視為消費者。 ……”
只要通用 class C<T>
的方法成員接收(即“消耗”)類型為T
的參數,則該方法是T
s 的使用者。
因此Comparator<T>.compareTo(T o)
被認為是由類型變量T
表示的類型的o
object 的“消費者”。
當我們說“ Comparable
是一個消費者”時,我們實際上的意思是“接口的方法是一個消費者”。 這是對您懷疑“ Comparable
只是一個接口”的答案。
查看其簽名: https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Comparable.html#compareTo(T)
int compareTo(T o)
它使用通用T
,不產生任何通用 object。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.