簡體   English   中英

Java泛型:Collections.max()簽名和Comparator

[英]Java generics: Collections.max() signature and Comparator

我理解集合的get和put原則 :如果一個方法接受一個集合,它會寫一個類型T,參數必須是Collection<? super T> Collection<? super T> ,如果它將從中讀取類型T,則參數必須為Collection<? extends T> Collection<? extends T>

但有人可以解釋Collections.max()簽名:

public static <T> T max(Collection<? extends T> coll,
                    Comparator<? super T> comp)

特別是為什么Comparator<? super T> Comparator<? super T>代替Comparator<? extends T> Comparator<? extends T>

Josh Bloch的助記符PECS在這里很有用。 它代表:

制作人extends ,消費者super

這意味着當傳遞給方法的參數化類型將生成 T實例(它們將以某種方式從它中檢索)時, ? extends T 應該使用? extends T ,因為T的子類的任何實例也是T

當傳遞給方法的參數化類型將使用 T實例(它們將被傳遞給它來做某事) ? super T 應該使用? super T因為T的實例可以合法地傳遞給任何接受某些超類型T 例如,可以在Collection<Integer>上使用Comparator<Number> ? extends T ? extends T不起作用,因為Comparator<Integer>無法對Collection<Number>

編輯:澄清get / put(生產/消費)的更多內容:

public T something();
       ^

以上是產生T的方法。

public void something(T t);
                      ^

以上是消耗T的方法。

“Producer extends ,Consumer super ”適用於參數化對象傳遞給的方法將如何使用該對象。 Collections.max()的情況下,將從Collection檢索項目,因此它是一個生產者。 這些項將作為參數傳遞給Comparator上的方法,因此它是一個使用者。

比較器消耗一對Ts並產生一個int。 Collection產生比較器消耗的Ts。

超級消費,延伸產品。

關於get和put原則,get產生並放置消耗。

比較器需要能夠將T作為參數。

暫無
暫無

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

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