泛型的PECS原则PECS(Producer extends Consumer supper)原则是用来帮助我们判断何时使用 ?extends T, 何时使用 ?super T的。
PECS的全程是Producer Extends Consumer Super,第一次听说,我一脸懵逼。但看到jdk中越来越多的泛型代码,我决定去了解一下。 java的泛型,只在编译期有效。 这就是PECS原则。 为了解释这个原理,我们创建三个类。 A,B,C。 其中。A extends B,B extends C。 这也就有了我们上面所提到的“Producer Extends Consumer Super”,也就是PECS原则。 这个过程可真是绕,我认为这是定义非常失败的一个名词。 想要对PECS有更深入的了解,可以深入了解一下函数编程相关的这四个接口。哪怕你只是看一下它的定义,也会有一种原来如此的感觉。
在泛型的上限和下限中有一个原则:PECS(Producer Extends Consumer Super) 请记住PECS原则: 生产者(Producer)使用extends; 消费者(Consumer
四、 终极武器:通配符与 PECS 原则 为了打破“不变性”的限制,我们需要通配符 ?。 1. 上界通配符 <? extends T> (协变) 含义: 类型是 T 或 T 的子类。 PECS 准则:如何选? 记住这个口诀:Producer Extends, Consumer Super。 如果你需要从集合中取数据(生产者),用 extends。 理解了擦除机制和 PECS 原则,你就掌握了 Java 泛型的灵魂。 作者: 予枫 (YF)
记住这个口诀: PECS = Producer-Extends, Consumer-Super 如果你从集合中读取数据(它是“生产者”),用 ? super T(往里面写 T 类型的数据) 完美符合 PECS! 四、泛型的局限性(你知道吗?) 遵循 PECS 原则:生产者用 extends,消费者用 super。 六、总结:泛型的本质 概念 关键点 类型擦除 泛型只在编译期存在,运行时被擦除为 Object 或上限类型 通配符 ? 理解了类型擦除和PECS 原则,你就掌握了泛型的“内功心法”。 下次面试官再问:“说说泛型的原理”,你就可以从容不迫地说: “Java 泛型基于类型擦除实现,编译期检查类型安全,运行时擦除泛型信息。 super T,并遵循 PECS 原则……”
时间:2009.06.21 10:50:00已核实 页码:第119页,倒数第2段 原文:Both parameters, s1 and s2, are E producers, so the PECS mnemonic tells us that the declaration should be: 译文:s1和s2这两个参数都是E消费者,因此根据PECS,这个声明应该是: 修正:s1和s2这两个参数都是 E生产者,因此根据PECS,这个声明应该是: 说明:感谢 jinlingmin0624 提出,多谢!
IllegalAccessException, InstantiationException { T r = t.newInstance(); return r; } SelfBound 可以防止类型重载 泛型不是协变的 PECS Object fruit = apples.get(0); PECS原则总结 从上述两方面的分析,总结PECS原则如下: 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? PECS JDK源码案例Collections copy方法 image.png
网上有一个简单的原则叫PECS(Producer Extends Consumer Super)原则:往外读取内容的,适合用上界 Extends,往里插入的,适合用下界 Super。 有人认为这是该函数的作者强调 PECS 原则,但是在这个情境下,这个原则并不合适。 其实,我们可以只把 T 固定为 Number,然后少用一个 <? 如果条件允许,比如这个函数中的 是根据参数类型确定的,我们应该优先使用 T,而不是生搬硬套 PECS 原则。 关于 PECS,我至今没记住这几个英文单词的顺序,我认为不能生搬硬套,还是要根据实际情况分析是否合理。 因为 PECS 最大的问题是它只告诉你用通配符泛型的情景下你应该如何选择,没有告诉你什么时候用 通配符泛型,什么时候不用。
[简单粗暴]一文彻底搞懂Java泛型中的PECS原则(在坑里躺了多年终于爬出来了) 两种限定通配符 表示类型的上界,格式为:<? super T>,即类型必须为T类型或者T的父类 PECS原则 生产者只能用extends,消费者只能用super 上代码 public class Fruit { } public class Apple 限定通配符泛型(还不确定的泛型,但是有范围), 一般用于只添加(也可以获取,但是获取出来的是Object,没啥意义) List list 明确的泛型,可获取,也可添加,也是我们用的最多的泛型 JDK中的PECS
PECS 来自《Effective Java》的一句话,producer-extends,consumer-super,两者通过规定上下界的形式来做数据限制。 (int i=0; i<srcSize; i++) { di.next(); di.set(si.next()); } } } PECS
什么是PECS原则? isEmpty()) { fruits.add(pop()); } } 复制代码 PECS原则 该如何理解生产者和消费者呢,? super E则相反,它是一直向集合中进行添加,就好像给它的东西都被它消费了一样,所以我们称它为消费者 那什么是PECS原则? PECS法则与extends和super关键字 《Effective Java(第三版)》 第31条 JAVA通配符——? extends T ,? super T(尖括号不让打吗不是吧不是吧)
PECS原则(Producer-Extends, Consumer-Super): 生产者(读取数据)用 <? extends T>。 消费者(写入数据)用 <? super T>。 // 泛型方法示例 public <T> T getFirst(List<T> list) { return list.get(0); } // PECS应用:集合复制 public static
具体的分析可以看下如下 : 最终PECS (Producer Extends Consumer Super ) 原则 频繁往外读取内容的,适合用上界Extends。 PECS原则 最后看一下什么是PECS(Producer Extends Consumer Super)原则,已经很好理解了: 频繁往外读取内容的,适合用上界Extends。
cannot be refrenced from static context" */ public static <E> void get(E t){ } } 范型通配符 泛型中的PECS PECS原则 所以我们得出了一个结论:PECS(Producer Extends Consumer Super)原则: 频繁往外读取内容的,适合用上界Extends。
著名的PECS法则 上一章节中引出了java中通配符的概念,java中的通配符可分为三类: 1.无界通配符:? 2.子类限定通配符:<? extends E> 3.父类限定通配符:<? 这就是我们要讲的PECS原则。什么是PECS?PECS的全称可以理解为Producer-Extends-Consumer-Super,即其描述了子类限制符和父类限制符的使用原则。 1.<? 声明处变量的作用就是在泛型类型参数前添加特定修饰符,来保证只会返回特定元素(即PECS中的生产),而不会消费任何元素(PECS中的消费)。 kotlin中的声明处变量可以相对于java中的PECS理解:可简称为CIPO。C即是Consumer,I表示in,P表示生产者,O表示out。CIPO和java中的PECS一致。
PECS原则 最后简单介绍下Effective Java这本书里面介绍的PECS原则。 上界不能往里存,只能往外取,适合频繁往外面读取内容的场景。
五、PECS原则 最后看一下什么是PECS(Producer Extends Consumer Super)原则,已经很好理解了。 1、频繁往外读取内容的,适合用上界Extends。
Java 的上界通配符和下界通配符符合 PECS 原则。 PECS 原则即 Producer Extends,Consumer Super 。如果参数化类型是一个生产者,则使用 <?
PECS原则 上界<? extends T>不能往里存,只能往外取,适合频繁往外面读取内容的场景。 下界<?
五、PECS原则 最后看一下什么是PECS(Producer Extends Consumer Super)原则,已经很好理解了。 1、频繁往外读取内容的,适合用上界Extends。