我了解 get and put principle对于集合:如果一个方法接收一个它将写入类型 T 的集合,则参数必须是 Collection<? super T>
,而如果它会从中读取类型 T,则参数必须是 Collection<? extends T>
.
但是谁能解释一下 Collections.max()
签名:
public static <T> T max(Collection<? extends T> coll,
Comparator<? super T> comp)
特别是为什么Comparator<? super T>
而不是 Comparator<? extends T>
?
最佳答案
Josh Bloch 的助记符 PECS 在这里很有用。它代表:
制作人 extends
, 消费者 super
这意味着当一个参数化类型被传递给一个方法时,将产生 T
的实例。 (它们将以某种方式从中检索),? extends T
应该使用,因为 T
的子类的任何实例也是一个T
.
当一个参数化类型被传递给一个方法时,将使用 T
的实例(他们将被传递给它做某事),? super T
应该使用,因为 T
的实例可以合法地传递给任何接受 T
的父类(super class)型的方法.一个 Comparator<Number>
可用于 Collection<Integer>
, 例如。 ? 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
上的方法。 ,所以它是一个消费者。
关于Java 泛型 : Collections. max() 签名和比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248390/