java的PECS原则

注,本文部分内容来自网络,如有侵权联系删除

关于java泛型

java泛型是一种非常常用的高级语法,在早期的java版本中由于不支持泛型导致很多时候对于容器里的变量无法预知他的类型。
在引入了泛型的概念之后容器里存放的数据的类型就是确定的,所有的数据都可以使用固定的引用来接收。

什么是PECS

1.P:producer ,(生产)代表从容器里取出东西
2.E:extends,(继承)使用菱形语法<?extend Father>
3.C:consumer,(消耗)代表存入东西
4.S:super,(..的父类)使用菱形语法

PECS原则的本质
class Animal {
}
class  Mammal extends Animal {
}
class Cat extend Mammal{
}

List<?extend T> list 获得数据
现在考虑什么是List<?extend Animal> list;
这是一个引用,他可以指向ArrayList<Mammal>();或者ArrayList<Cat>();

List<? extends Animal> list=new ArrayList<Mammal>();
List<? extends Animal> list=new ArrayList<Cat>();

但是具体的指向是不清楚的。
我们可以使用父类可以指向子类对象的特性;
使用

Animal animal=list.get(i);

这个时候不论是哪个类型的都可以接到。
也就是说Producer的功能是正常的。可以取数据。

List<?extend T> list 写入数据

如果要写入数据,由于不能预先获得当前指向的列表的类型,可能将父类型对象写入子类型列表。子类型的引用不能指向父类型。

List<?super T> list 读取数据
List<? super Cat> list=new ArrayList<Animal>();
List<? super Cat> list=new ArrayList<Mammal>();

如果想读取list 里的数据,必须先知道里面有什么,我们知道列表里的都是Cat或者是Cat的父类型,但是要使用什么来接收,当然可以使用Object objectref;但是这样就丢失了类型信息。
所以List

List<?super T> list 写入数据

由于此时可以确定列表里的元素一定是Cat的父类型,而父类型的引用可以指向子类型对象,所以可以使用它来写入Cat类型的数据。

参考:

http://www.cnblogs.com/fickleness/archive/2013/06/21/3149011.html
还有Effective Java

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值