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
作为参数。