ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA的PECS原则

2019-08-21 21:03:00  阅读:422  来源: 互联网

标签:PECS JAVA 原则 子类 Fruit add fruitList 泛型 new


原文链接: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 <T> void copy(List<? super T> dest, List<? extends T> src) {

dest集合持有?super T ,可以往里面写入所有T及其子类对象,而src集合持有? extends T泛型。可以确保的是从里面读取的数据都是T及其子类。所以可以写入dest了。

PS:Java 类的final方法和static不能复写

Reference

1:https://www.cnblogs.com/ygj09...

2: http://www.importnew.com/8966...

标签:PECS,JAVA,原则,子类,Fruit,add,fruitList,泛型,new
来源: https://blog.csdn.net/qq_15037231/article/details/99997543

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有