Jas*_*n S 25 java generics comparator
我理解集合的get和put原则:如果一个方法接受一个集合,它将写入一个类型T,参数必须是Collection<? super T>,而如果它将读取一个类型T,参数必须是Collection<? extends T>.
但有人可以解释Collections.max()签名:
public static <T> T max(Collection<? extends T> coll,
Comparator<? super T> comp)
Run Code Online (Sandbox Code Playgroud)
特别是为什么它Comparator<? super T>而不是Comparator<? extends T>?
Col*_*inD 65
Josh Bloch的助记符PECS在这里很有用.它代表:
制片人extends,消费者super
这意味着,当一个参数化的类型被传递给的方法将产生的实例T(它们将从它以某种方式被检索),? extends T应该被使用,因为子类的任意实例T也是T.
当一个参数化类型被传递给方法会消耗的情况下,T(他们将被传递给它做一些事情),? super T应该使用,因为实例T可以合法地传递给一个接受的某些超类型的任何方法T.例如,A Comparator<Number>可用于a Collection<Integer>.? extends T不行,因为一个Comparator<Integer>不能操作Collection<Number>.
编辑: 澄清get/put(生产/消费)的更多内容:
public T something();
^
Run Code Online (Sandbox Code Playgroud)
以上是一种产生的方法T.
public void something(T t);
^
Run Code Online (Sandbox Code Playgroud)
以上是一种消耗的方法T.
"Producer extends,Consumer super"适用于参数化对象传递给的方法将如何使用该对象.在这种情况下Collections.max(),将从中检索项目Collection,因此它是生产者.这些项将作为参数传递给方法Comparator,因此它是一个消费者.