pecs_java泛型-PECS

本文详细探讨了Java中的PECS原则,即Producer extends, Consumer super。通过示例代码解释了如何使用? extends Number和? super Number声明泛型容器,分别限制了容器的读写操作。PECS原则有助于防止类型不匹配问题,提高代码的安全性和可读性。
摘要由CSDN通过智能技术生成

1 packagecom.example.base;2

3 importjava.util.ArrayList;4 importjava.util.List;5

6 importcom.example.spring.MyLog;7 /**

8 * Producer extends Consumer super 生产者使用extends,consumer使用super9 * 这里的生产者和消费者是相对容器而言的,10 * 生产者只能对外提供数据,不可以写入数据,数据来源于赋值操作(将参数化类型为子类的容器赋值过来)11 * 消费者表示只能向容器中写入数据,不能读取(只能以Object来接收)12 * 这里的extends和super指的是声明类型和参数化类型的关系,13 * 如下所示:等号左侧类型为声明类型,右侧为参数化类型14 * List extends Number> intList = new ArrayList();15 * private List super Number> intList2 = new ArrayList();16 * @DESC17 *@authorguchuang18 *19 */

20 public classPECS {21

22 int int1 = 1;23 long long1 = 11;24 Number number1 = 10;25

26 private List intList = new ArrayList();27 private List longList = new ArrayList();28 private List numberList = new ArrayList();29

30 public static voidmain(String[] args) {31 PECS pecs = newPECS();32 pecs.pe();33 pecs.cs();34 }35

36 /**

37 * extends Number> 这种方式声明的泛型容器,不能写入任何类型的数据,只能读取数据38 * 其指定了上确界为Number,参数化类型(如:实际新建的容器类型T new ArrayList())必须是Number的子类,所以读出的数据都可以上转型为Number39 * 理论含义是容器内包含的数据可能是Number的任何一种子类,所以无法添加数据。40 * 写数据的方式:41 * 声明一个具体类型(Number的子类型)的容器,向其中添加数据,将这个容器赋值给numbers容器42 * 优势:43 * 避免调用者向此容器内写入数据,只能读取里面的数据44 */

45 public voidpe() {46 // extends Number> 这种方式声明的泛型容器,不能写入任何类型的数据

47 List extends Number> numbers = new ArrayList();48 //下面三种添加数据都会导致编译报错49 //foo.add(int1);50 //foo.add(long1);51 //foo.add(number1);52

53 //Number number = numbers.get(0);

54

55 intList.add(123);56 intList.add(456);57 //将新创建的具有确定类型的容器(必须是Number的子类型)赋值给numbers,起到生产数据的目的

58 numbers = intList; //新容器的参数化类型是Integer,是Number的子类,所以可以赋值

59 MyLog.info(numbers);60 Number number = numbers.get(0); //读出来的类型依然是Number

61 MyLog.info("read from ? extends Number: " +number);62 numbers =longList;63 numbers =numberList;64 }65

66 /**

67 * Consumer super68 * ? super Number 表示容器中所有的数据类型都是Number或者Number的超类型,69 * 所以Number及其子类型(可以上转型为Number)可以写入,读取的时候由于不能确定类型,只能使用Object接收70 */

71 public voidcs() {72 List super Number> numbers = new ArrayList();73 numbers.add(int1);74 numbers.add(long1);75 numbers.add(number1);76 //numbers.add(new Object()); 编译报错

77 MyLog.info(numbers);78

79 //Number n = numbers.get(0); 编译报错

80 Object n = numbers.get(0); //只能以Object来接收数据81 //numbers = intList; 编译报错

82 numbers =numberList;83 numbers = new ArrayList();84 }85 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值