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