Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26314781
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-06-14 23:05:22

java中的泛型一

时间:2010-6-13

一、Java中的泛型

JAVA里面能够用到泛型最多的是容器类。如各种list map set等。因为JAVA是单根继承的所以容器里面可以放的内容是任何Object,所以从意义上来讲原本的设计才是泛型。如果我们经常使用JAVA我们发现需要强制转型。比如说提取的时候是Object的然后呢

List a = (List)b.getObject();   诸如出现这样的表达式就是一种强制转型的过程!

转得要不好的话容易出现cast异常什么的。挺头疼的。所以JDK1.5开始引入泛型进来。

 

二、泛型的用法

实例A

ArrayList strList = new ArrayList();

        strList.add("1");

        strList.add("2");

        String string = strList.get(1);//没有作类型转换了

        System.out.println(string);

        strList.add(new Object());//直接报编译错误

这个其实我们平时经常会用到的。就是一个容器里面我们存放的数据类型是明确的。到时我们在存储数据的时候就指定类型存储。就不会出现这种数据转换错误的了!

 

 

三、一家之言

JDK引入泛型第一个要解决的问题就是 从此以后我们不需要再进行强制类型转换了哦!

 

四、BoxingUnBoxing

基础类型放到容器里面去不需要再先包装,取回来的时候还得先转了再提取了。

ArrayList strList = new ArrayList();

        strList.add(1);

        strList.add(2);

        int j = strList.get(1);

        System.out.println(j);

看到没有这里面我们没有进行包装吧。即整数还是整数的。不需要先包装的!

 

五、  泛型的生命周期(使用的注意事项)

在泛型的实现上,C++Java有着很大的不同,
Java
是擦拭法实现的
C++
是膨胀法实现的
因为Java原本实现就是泛型的,现在加入型别,其实是"窄化",所以采用擦拭法,在实现上,其实是封装了原本的
ArrayList,
这样的话,对于下边这些情况,Java的实现类只有一个。

1ArrayList  .;   public class ArrayList
2ArrayList  ..;   --
同上--
3ArrayList  ..;   --同上--
4C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
5list<int> li;                class list; //int 版本
6list ls;             class list; //string 版本
7list<double> ld;             class list; //double 版本    

这就造成了,在序列化后,Java不能分清楚原来的ArrayList
ArrayList
还是ArrayList

如果我们试着把ArrayList list的内容序列化,然後再读取出来,在使用的过程中会发现出错,为什么呢?用Stream读取一下回来的数据,你会发现不见了,list变成了普通的ArrayList,而不是参数化型别的ArrayList了。

 

 

阅读(890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~