簡體   English   中英

為什么 Comparable 和 Comparator 是 Java 中 PECS 通配符類型的消費者

[英]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.

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