问题标签 [pecs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 什么是PECS(Producer Extends Consumer Super)?
我在阅读泛型时遇到了 PECS(生产者extends
和消费者的缩写)。super
有人可以向我解释如何使用 PECS 来解决和之间的混淆extends
吗super
?
java - Java 的 TreeSet.add() 不遵循 PECS 原则问题 (Generics)
我有以下代码:
我no suitable method for...
在添加段实例时得到一个。似乎 Java 的树集没有应用 PECS 原则。这个问题有解决方案吗?
解决方案
我实现了:
inSegmentImpl_v1
并调用它someFunction()
。
java - 是否可以编写一个接受不同抽象的通用参数的方法?
作为这个问题的后续,是否可以编写一个将 a 添加Dog
到合适房间的方法?(在这个例子中,它会接受一个Animal
房间或一个Dog
房间。)或者我是否被迫编写如下两种不同的方法?(由于类型擦除,我什至不能依赖重载)。
java - Java 泛型 PECS
我知道PECS是什么意思。
生产者扩展,消费者超级。
问题是我怎么知道它是消费者还是生产者?
此代码是否也遵循“PECS”
java - 为什么在集合中添加类型为 a 的子类是非法的?
鉴于此代码段
为什么不允许 num.add(doub) ?不是List<List<Number>>
超级类型
List<List<Double>>
吗?
java - 具有“超级”类型的有界泛型方法
根据我阅读的文献,我们有 juicy fruits 实现了以下接口:
使用有界类型变量,以下方法将取出一堆水果并将它们全部挤压:
现在我们也需要如下的低级兄弟姐妹来工作:
所以我希望该方法如下所示:
相反,我发现方法签名如下:
是什么解释了这种差异?
java - Java 泛型(有界通配符)
根据 Joshua Bloch 的“Effective Java”一书,有一条关于如何/何时在泛型中使用有界通配符的规则。这条规则就是 PECS(Producer-Extends,Comsumer-Super)。当我研究以下示例时:
我知道这条规则非常适合这个例子。我必须将该方法声明pushAll
为以下示例:
但是,如果我有以下示例,会发生什么?
我必须声明pushAll
如下:
根据PECS规则,上述声明是错误的。但我想要 a Stack
of Integer
s 并传递给这个Stack
a Number
。为什么不去做呢?
为什么我应该总是使用extends
关键字?为什么使用super
是错误的?
当然,同样代表消费者的观点。为什么消费者应该永远是super
?
PS:更具体地说,您可以在参考书的“第 28 项”部分找到上述示例。
java - Java、泛型和 PECS:仍然无法理解 C 部分;具体例子?
我将在这里发布一个链接:Collections.sort()
. 关于 PECS 范式的 SO 上有很多帖子,包括这个。在我自己的个人代码中,我经常使用泛型,但只使用过 P 部分(即<X extends SomethingElse>
)。
Collections.sort
期望作为其泛型参数 a <T extends Comparable<? super T>>
。我看不到那里的super
踢脚线。你有一个具体的例子说明为什么这是必要的吗?
当我这样做时,我很担心我也不理解 P 的全部含义......我已经阅读了很多很多链接,但没有清楚、明显的证据证明 P 是 P 并且 C 是 C。 ..
编辑至于这里可能已经有答案“:不,抱歉。我已经阅读了这个链接,以及其他许多关于 SO 的链接。这仍然没有告诉我这一切背后的核心机制。到目前为止给我的两个答案给出了我的提示,实际上比到目前为止我能找到的所有链接都多。
java - 生产者和消费者在 Java 中的泛型
我有这个方法来检索作为给定类的实例的对象:
要调用该方法,我可以执行以下操作:
这很好,但我也希望能够以这两种方式调用该方法:
或者
我的意思是我希望能够将方法的结果存储在狗集合或动物集合中,因为Dog.class
扩展Animal.class
我在想这样的事情:
但它不起作用。有什么提示吗?
编辑:最后,使用@Rohit Jain 回答,这是调用 UtilitiesClass 方法时的解决方案:
java - 克服泛型 put-get 规则
我已经阅读了应该阻止您将 a 添加到 a的泛型 get 和 put 规则:Banana
List<? extends Fruit>
我知道,如果您没有编译错误,您将能够:
这听起来是错误的,因为您在同一个列表中获得了不同的对象类型(我看到@Tom Hawtins 的回答解释了原因,我相信他:)(虽然我找不到它的链接))。
但是,如果您执行以下操作:
然后做:
你没有得到编译错误,以及以下(预期的)输出:
我这样做是否违反了任何合同?还是我在规避保护并且不应该这样做?