- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Effective Java 中,Joshua Bloch 讨论了 PECS(Producer-Extends,Consumer-Super)的原理。
我对此的理解是,为了提高 API 的灵活性,输入(产生的集合)应该是协变的,而输出(消耗的集合)应该是逆变的。
实现此原则的函数可以具有以下签名:
private static void func( ArrayList<? extends Object> input, ArrayList<? super Integer> output)
trait Function1[-T1, +R] extends AnyRef
最佳答案
Joshua 是对的,Scala 也是。事实上,Scala 强制执行此规则,因此您无需担心。 Java,因为它没有变化注释并且必须在调用站点处理存在性,所以需要它们来指导程序员进行正确的设计。
Scala 在定义点有差异注解,而 java 在调用点有存在性注解。调用的输出是定义的输入,反之亦然。
A Function1
不是从其参数中读取,也不是写入其结果,这就是 reduce
以约书亚为例。相反,您必须考虑 Function1
作为一个集合。
当您写入一个集合时,该集合是一个使用者。类似于函数:当你调用它时,你正在写入它。因此,正在写入的输入参数必须是逆变的。
同样,当您从一个集合中读取时,该集合就是一个生产者。您通过查看其结果来读取函数,因此输出参数必须是协变的。
如您所见,这正是 Function1
符号。
关于Scala:为什么 PECS 原则不适用于 Function1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11272819/
关闭。这个问题是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 之间的混淆吗
我是一名优秀的程序员,十分优秀!