gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:21:15 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com