Java 泛型 : Collections. max() 签名和比较器

标签 java generics comparator

我了解 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/

相关文章:

javascript - 使用 GWT 通过 HTTP POST 下载文件

java - String的子串函数与StringBuffer的子串函数

java - 比较 Java 中的两种泛型类型?

delphi - 如何使用 RTTI 检查或更改存在哪些集合元素?

java - 在 Java 中传递比较器语法帮助

java - 有没有办法在 Java 中创建条件比较器?

java - 如何检查 JIT 编译器是否在 Java 中关闭

java - 使用具有原始返回类型的泛型方法

java - 如何比较方法与比较类型的附加功能?

java - Graphql 联合在扩展关系上返回 null