java中的泛型一[转载]
时间:2010-06-14 来源:hkebao
java中的泛型一
时间:2010-6-13
一、Java中的泛型
在JAVA里面能够用到泛型最多的是容器类。如各种list map set等。因为JAVA是单根继承的所以容器里面可以放的内容是任何Object,所以从意义上来讲原本的设计才是泛型。如果我们经常使用JAVA我们发现需要强制转型。比如说提取的时候是Object的然后呢
List a = (List)b.getObject(); 诸如出现这样的表达式就是一种强制转型的过程!
转得要不好的话容易出现cast异常什么的。挺头疼的。所以JDK1.5开始引入泛型进来。
二、泛型的用法
实例A。
ArrayList<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("2");
String string = strList.get(1);//没有作类型转换了
System.out.println(string);
strList.add(new Object());//直接报编译错误
这个其实我们平时经常会用到的。就是一个容器里面我们存放的数据类型是明确的。到时我们在存储数据的时候就指定类型存储。就不会出现这种数据转换错误的了!
三、一家之言
JDK引入泛型第一个要解决的问题就是 从此以后我们不需要再进行强制类型转换了哦!
四、Boxing和UnBoxing
基础类型放到容器里面去不需要再先包装,取回来的时候还得先转了再提取了。
ArrayList<Integer> strList = new ArrayList<Integer>();
strList.add(1);
strList.add(2);
int j = strList.get(1);
System.out.println(j);
看到没有这里面我们没有进行包装吧。即整数还是整数的。不需要先包装的!
五、 泛型的生命周期(使用的注意事项)
在泛型的实现上,C++和Java有着很大的不同,
Java是擦拭法实现的
C++是膨胀法实现的
因为Java原本实现就是泛型的,现在加入型别,其实是"窄化",所以采用擦拭法,在实现上,其实是封装了原本的
ArrayList,这样的话,对于下边这些情况,Java的实现类只有一个。
1ArrayList<Integer> .; public class ArrayList
2ArrayList<String> ..; --同上--
3ArrayList<Double> ..; --同上--
4而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
5list<int> li; class list; //int 版本
6list<string> ls; class list; //string 版本
7list<double> ld; class list; //double 版本
这就造成了,在序列化后,Java不能分清楚原来的ArrayList是
ArrayList<Integer>还是ArrayList
如果我们试着把ArrayList<String> list的内容序列化,然後再读取出来,在使用的过程中会发现出错,为什么呢?用Stream读取一下回来的数据,你会发现<String>不见了,list变成了普通的ArrayList,而不是参数化型别的ArrayList了。