jdk1.5中的新特性 -凯发k8网页登录

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

jdk1.5中的新特性 --泛型 (详细版)

本来只转载了个链接,和一个简单的使用程序,但昨天不小心看到有人批判jdk1.5,先说java要强制转型不好的问题没解决,
容器不能放基类型不好,接着说泛型没用。而恰恰jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型。

一,java中的泛型:
在java中能使用到泛型的多是容器类,如各种list map set,因为java是单根继承,所以容器里边可以放的
内容是任何object,所以从意义上讲原本的设计才是泛型。但用过java的人是否感觉每次转型很麻烦呢?
而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是
无从发现的。所以jdk1.5中提供了泛型,这个泛型其实是向c 靠拢了.好,我们先看几个实例再细说原理。

二,泛型的用法:(多个实例)

1 实例a
2 arraylist < string >  strlist  =   new  arraylist < string > ();
3 strlist.add( " 1 " );
4 strlist.add( " 2 " );
5 strlist.add( " 3 " );
6 // 关键点(1) 注意下边这行,没有强制转型
7 string str  =  strlist.get( 1 );
8 // 关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好
9 strlist.add( new  object());

1 实例b
2 arraylist < integer >  ilist  =   new  arraylist < integer > ();
3 // 关键点(3) 注意直接把整数放入了集合中,而没有用integer包裹
4 ilist.add( 1 );
5 ilist.add( 2 );
6 ilist.add( 3 );
7 // 关键点(4)同样直接取出就是int
8 int  num  =  ilist.get( 1 );

1 实例c
2 // 关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。
3 hashmap < integer,integer >  map  =   new  hashmap < integer,integer > ();
4 map.put( 1 11 );
5 map.put( 2 22 );
6 map.put( 3 33 );
7 int  inum  =  map.get( 1 );
8

三,看完了实例了,详细来说说为什么吧
首先jdk1.5中的泛型,第一个解决的问题,就是java中很多不必要的强制转型了,具体的实现,我们以arraylist
为例,下边是arraylist中的片断代码:

 1arraylist类的定义,这里加入了<e>
 2public class arraylist<e> extends abstractlist<e>
 3        implements list<e>, randomaccess, cloneable, java.io.serializable
 4
 5//get方法,返回不再是object 而是e
 6public e get(int index) {
 7    rangecheck(index);
 8    return elementdata[index];
 9}

10//add方法,参数不再是object 而是e
11public boolean add(e o) {
12    ensurecapacity(size  1);  // increments modcount!!
13    elementdata[size= o;
14    return true;
15}

16


四,boxing 和unboxing
看到上边的关键点(3)和(4)是否感觉惊奇呢,因为java中烦人的除了强制转型,另一个就是基础类型了
放入容器的时候要包装,取出了还要转回。jdk1.5中解决了这个问题.如上边的使用方法

五,泛型的生命周期(使用注意事项)
如果我们试着把arraylist list的内容序列化,然後再读取出来,在使用的过程中会发现出错,
为什么呢?用stream读取一下回来的数据,你会发现不见了,list变成了普通的arraylist,而不是
参数化型别的arraylist了,为什么会这样呢 ?见下边的比较

六,c 的泛型和java的泛型
在泛型的实现上,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还是arraylist

七,题外话,在很多东西的实现上c 和java有很多不同
例如运算符的问题i=i 问题,
例如在c 中能很好实现的double-checked locking单态模式,在java中几乎很难实现 详细看这里
还有就是上边提到的泛型实现上。

八,jdk 1.5加入了不少新东西,有些能很大的提高开发质量,例如jdk1.4 ,jdk.15中stringbuffer的不同
因为从1。4转入1。5不久,所以慢慢会发一些在1。5的使用过程中发现的东西。

最后,我们还可以自己写类似arraylist这样的泛型类,至于如何自定义泛型类,泛型方法请参见候捷先生的文章

本文大部份内容来自候捷写的jdk1.5泛型的文章  向他致敬。

posted on 2006-11-08 11:04 dreamstone 阅读(5413) 评论(7)  编辑  收藏 所属分类: jdk相关

# re: jdk1.5中的新特性 --泛型 (详细版) 2006-11-08 13:33

不错,值的学习  回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2006-11-10 11:31

谢谢,以前真的一点都不知道~~  回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2007-01-09 21:10 施伟

读了,不错  回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2007-02-04 00:07

谢谢..   回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2007-02-18 01:18

总觉得java 1.5中有很多概念不如原来那么一致和优雅. 比如很多情况下需要借助bridge方法. 对初学者来说, java 1.5的魅力肯定有所减少. java1.5 generics的开发花了5年多的时间, 相信如果不是c#的压力,到现在也不一定能发布呢. 很显然的java1.5恰恰预示了我们需要下一个更好的语言, 不知道是哪个? 现在有原来搞java的大牛都转向ruby了. 一直到现在还没有时间去看看ruby到底怎么样, 据说是小日本搞出来的.   回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2007-02-20 09:47

泛型是一个挺有趣的东东,继续使用ing~~~~~~  回复     

# re: jdk1.5中的新特性 --泛型 (详细版) 2008-05-23 09:20

不错。。学习下  回复     


只有注册用户后才能发表评论。


网站导航:
              
 
网站地图