注,本文部分内容来自网络,如有侵权联系删除
关于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