- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Joshua Bloch 提出了 PECS,它规定了何时使用 的规则?扩展 T
和 ? super T
。如果您从集合框架的角度考虑 PECS,那么它非常简单。如果向数据结构添加值,请使用 ? super T
。如果从数据结构中读取,使用?扩展 T
。例如:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
如果我检查
的签名public static <T> void sort(List<T> list, Comparator<? super T> c)
我看到 Comparator 使用 ? super
,所以它应该是一个消费者。看代码,比较器c只是用来产生东西的,因为它被问到比较的逻辑。
一方面,我理解为什么它是一个 super 类,因为作为开发人员,我想使用 T
类的比较器以及父类(super class) T
的比较器,因为对象T
也是T
的父类(super class)类型。但是,当我尝试从 PECS 的角度思考时,我却无法理解。
PECS 是否仅适用于 Collections 框架?如果不是,有人可以向我解释比较器在 Collections.sort
中消耗了什么吗?
最佳答案
为了这个答案,我们取 Comparator
作为主要的指导性示例。
如果仔细考虑,您会发现 Comparator
实际上接收两个T
类型的参数并返回它们的比较结果(由 int
表示)。换句话说,它消耗两个 T
类型的实例并且产生一个int
值(value)。因此,根据 PECS 规则,它是 T
的消费者 ,因此使用 ? super T
.
更一般地说,您应该从主要类型的角度考虑生产者 和消费者,并考虑其每个泛型参数的类型。如果一些Comparator
type consumes T
类型的对象, PECS 规则规定此类 Comparator<T>
的用户可以用它来比较类型是 T
子类型的对象.
举个具体的例子,如果你碰巧已经有了比较两个通用 Number
的逻辑实例(不管它们的具体类型实际上是什么),你可以使用它来比较 Double
实例,因为 double 毕竟是数字。
考虑以下比较器:
Comparator<Number> c = Comparator.comparingInt(Number::intValue);
在这里,比较器 c
比较Number
实例(任何)只考虑它们的组成部分。
如果您有以下 Double
的列表实例:
List<Double> doubles = Arrays.asList(2.2, 2.1, 7.3, 0.2, 8.4, 9.5, 3.8);
以及以下sort
方法:
static <T> void sort(List<T> list, Comparator<T> c) {
list.sort(c);
}
(注意 ? super T
参数中没有通配符 Comparator
)。
然后,如果你想对 List<Double> doubles
进行排序名单,上面的签名sort
方法将要求您传递一个具体的 Comparator<Double>
.但是,如果您想使用之前定义的 c
怎么办?比较器对 List<Double> doubles
进行排序?
因为比较器的类型是 Comparator<Number>
, 作为 doubles
列表的类型是 List<Double>
,以下代码会产生编译错误:
sort(doubles, c);
幸运的是,作为Comparator
是它比较的元素类型的消费者,您可以更改 sort
的签名方法:
static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
现在,这段代码可以编译:
sort(doubles, c);
关于java - PECS 对于非集合中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575889/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
为什么我不能向消费者添加一个整数? import java.util.*; public class Test { public static void main(String[] args)
我有一家提供餐食的餐厅。厨房里的盘子是消费者的。 class Food{} class Bamboo extends Food {} interface Kitchen { void buil
Joshua Bloch 提出了 PECS,它规定了何时使用 的规则?扩展 T 和 ? super T。如果您从集合框架的角度考虑 PECS,那么它非常简单。如果向数据结构添加值,请使用 ? supe
我对这个方法有疑问来自 java.util.Collections : public class Collections { public static void copy(List dest
我知道PECS是什么意思。 生产者扩展,消费者 super 。 问题是我怎么知道它是消费者还是生产者? 此代码是否也遵循“PECS” public class Tree { //List of
我正在尝试匹配短语中的“单词”pec+ I cannot find pec+ 我已经尝试了模式\bpec\+\b,但是没有匹配项。 最佳答案 因为 + 不是单词字符,您需要使用 \B 匹配非单词边界来
在 Effective Java 中,Joshua Bloch 讨论了 PECS(Producer-Extends,Consumer-Super)的原理。 我对此的理解是,为了提高 API 的灵活性,
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
阅读 Java Essentials,第 2 版,有一个称为 PECS 的规则用于方法参数中的类型安全。如果它产生你扩展,消耗你使用 super 。对不起,如果我定义错误,因为我不明白。 谁能阐明 J
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。 有人可以向我解释如何使用 PECS 来解决 extends 和 super 之间的混淆吗
我是一名优秀的程序员,十分优秀!