Javagenerics:Collections.max()签名和Comparator

我理解集合的get和put原则 :如果一个方法接受一个集合,它会写一个类型T,参数必须是Collection Collection ,而如果它将从中读取类型T,则参数必须为Collection Collection

但有人可以解释Collections.max()签名:

 public static  T max(Collection coll, Comparator comp) 

特别是为什么Comparator Comparator代替Comparator Comparator

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

制片人extends ,消费者super

这意味着当传递给方法的参数化类型将生成 T实例(它们将以某种方式从它中检索)时, ? extends T 应该使用? extends T ,因为T的子类的任何实例也是T

当传递给方法的参数化类型将使用 T实例(它们将被传递给它来做某事) ? super T 应该使用? super T因为T的实例可以合法地传递给任何接受某种超类型T 。 例如,可以在Collection上使用Comparator? extends T ? extends T不起作用,因为Comparator无法对Collection

编辑:澄清一点关于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作为参数。