java pecs_JAVA的PECS原则
https://segmentfault.com/a/1190000017509439
JAVA的PECS原则
PECS指“Producer Extends,Consumer Super”
比如:
List extends Fruit> fruitList = new ArrayList<>();
fruitList.add(new Apple());
fruitList.add(new Orange());
但是编译器却报了编译错误:
按理说fruitList是一个持有类型为Fruit及其子类的泛型列表啊,为什么不能往其中添加Fruit的子类呢?
因为泛型的一大好处就是可以在编译时检查,避免传入不相符的类型可能导致的ClassCastException了。但是声明fruitList的时候没有明确的指定泛型的具体类型,所以编译器无法确认其持有的具体类型,当然也就拒绝了add操作。
fruitList只是规定了泛型的上限,但是并没有确定具体的类型,也无法确定具体的子类型,可以是Apple,Orange还可能是Banana,所以不能把具体的对象添加进去,不然使用的时候可能导致ClassCastException了。但是可以保证从里面取出来的数据都是Fruit及其子类,而且还是Fruit的某一个子类。
我们把代码改成下面这样子就可以添加不同的Fruit对象了。
因为我们规定了fruitList持有的都是Fruit及其父类,可以将Fruit 及其子类都添加进去
List super Fruit> fruitList = new ArrayList<>();
fruitList.add(new Apple());
fruitList.add(new Orange());
但是
fruitList.add(new Object());
却不行,why?因为在编译时无法确认具体的fruitList持有的是Fruit的哪一个父类,要想确定就必须指定具体泛型类了。所以就无法往里面写入Fruit的父类型对象。
所以我们可以从Java Collctions copy方法的签名可以看出
public static void copy(List super T> dest, List extends T> src) {
dest集合持有?super T ,可以往里面写入所有T及其子类对象,而src集合持有? extends T泛型。可以确保的是从里面读取的数据都是T及其子类。所以可以写入dest了。
PS:Java 类的final方法和static不能复写
Reference
标签:PECS,JAVA,原则,子类,Fruit,add,fruitList,泛型,new
来源: https://blog.csdn.net/qq_15037231/article/details/99997543
java pecs_JAVA的PECS原则相关推荐
- Java泛型之PECS原则
转载自: [Java]泛型中 extends 和 super 的区别? Java泛型详解 文章目录 通配符 上下界通配符的副作用 上界<? extends T>不能往里存,只能往外取 下界 ...
- java pecs_Java泛型PECS
我知道PECS是什么意思. 制作人扩展,消费者超级. 问题是我怎么知道它是消费者还是生产者? 此代码也遵循"PECS" public class Tree { //List of ...
- java pecs_Java 泛型 PECS
在stackoverflow上看到两篇关于java泛型 PECS 的问答: PECS Remember PECS:"Producer Extends,Consumer Super" ...
- Java泛型的PECS原则
1.什么是PESC ? PESC = producer-extens , consumer -super. 如果参数化类型表示一个 T 生产者,就使用 <? extends T>: 如果 ...
- Java泛型中的PECS原则
今天在写代码的时候使用到了这样一个方法签名: public void foo(Map<String, String> map); 在写这个参数的时候正好在想一些关于泛型的东西,于是: pu ...
- Java集合泛型作为参数时,使用中的一些问题。包括但不限于PECS原则
目录 泛型中的PECS原则以及使用注意 一.泛型中的型变(协变.逆变.不可变) 1. 什么是型变 2. 什么是协变(Covariance) 3. 什么是逆变(Contravariance) 4. 不可 ...
- pecs_Java泛型中的PECS原则
今天在写代码的时候使用到了这样一个方法签名:public void foo(Map map); 在写这个参数的时候正好在想一些关于泛型的东西,于是:public void foo(Map extend ...
- java pecs_『Java』泛型中的PECS原则
Java编程中有时我们要用到不确定的元素,通常用通配符"?"表示,其中" ? extends T "叫"上界通配符", " ? s ...
- Java 泛型中的PECS原则
在泛型编程时,使用部分限定的形参时,<? super T>和<? extends T>的使用场景容易混淆,PECS原则可以帮助我们很好记住它们: 生产者(Producer)使用 ...
最新文章
- linux xampp eclipse xdebug 无法进入断点
- XSZD00982 流向屏闭
- java表单自动绑定数据_java工作流系统表单自动 获取数据
- 区块链BaaS云服务(16)天德链TDBC“智能合约”
- pwn入门-PLT表与GOT表、libc入门
- 宁夏计算机专科大学排名,2019年民办学校排行榜_科普2019年宁夏专科学校排名及2019宁夏民办高校排...
- boost::gil::compute_harris_responses用法的测试程序
- JS开源框架Stimulus:让web应用在移动端达到原生体验!
- centos6.4修改网卡名
- JAVA秒杀mysql层实现_Java商城高并发秒杀系统架构分析设计与开发实战
- Windows Terminal 完全配置教程(主题以及启动设置)
- python训练模型测试模型_python 机器学习中模型评估和调参
- Hibernate命名查询示例 - @NamedQuery
- 基于机器视觉的滑块检测
- 如何在 Mac 上使用剪贴板?
- NPOI Word 多级标题结构设置
- Markdown编辑器:好看的字体颜色和各种表情符号
- Adobe Photoshop裁剪和拉直照片改善构图
- 微信小程序后台销毁时间 演变和总结(热启动时间限制)
- 学习笔记——共阳数码管的静态显示