注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

网易考拉推荐

Jdk1.5中的泛型 (详细版)  

2007-08-10 13:14:43|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

不小心看到有人批判jdk1.5,先说java要强制转型不好的问题没解决,容器不能放基类型不好,接着说泛型没用。而恰恰Jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型。
一,Java中的泛型:
    在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的内容是任何Object,所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢? 而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是
无从发现的。所以jdk1.5中提供了泛型,这个泛型其实是向c++靠拢了.好,我们先看几个实例再细说原理。

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

1 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! 实例A
2 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList < String >  strList  =   new  ArrayList < String > ();
3 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!strList.add( " 1 " );
4 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!strList.add( " 2 " );
5 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!strList.add( " 3 " );
6 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! // 关键点(1) 注意下边这行,没有强制转型
7 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! String str  =  strList.get( 1 );
8 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! // 关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好
9 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! strList.add( new  Object());

1 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! 实例B
2 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList < Integer >  iList  =   new  ArrayList < Integer > ();
3 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! // 关键点(3) 注意直接把整数放入了集合中,而没有用Integer包裹
4 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! iList.add( 1 );
5 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!iList.add( 2 );
6 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!iList.add( 3 );
7 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! // 关键点(4)同样直接取出就是int
8 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! int  num  =  iList.get( 1 );

1 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! 实例C
2 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! // 关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。
3 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! HashMap < Integer,Integer >  map  =   new  HashMap < Integer,Integer > ();
4 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!map.put( 1 11 );
5 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!map.put( 2 22 );
6 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!map.put( 3 33 );
7 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务! int  inum  =  map.get( 1 );
8 Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!

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

 1Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList类的定义,这里加入了<E>
 2Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!public class ArrayList<E> extends AbstractList<E>
 3Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 4Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!
 5Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!//get方法,返回不再是Object 而是E
 6Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!public E get(int index) Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!{
 7Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!    RangeCheck(index);
 8Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!    return elementData[index];
 9Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!}

10Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!//add方法,参数不再是Object 而是E
11Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!public boolean add(E o) Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!{
12Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!    ensureCapacity(size + 1);  // Increments modCount!!
13Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!    elementData[size++= o;
14Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!    return true;
15Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!}

16Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!


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

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

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

1Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList<Integer>  Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!.;   public class ArrayList
2Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList<String>  Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!..;   --同上--
3Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!ArrayList<Double>  Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!..;   --同上--
4Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
5Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!list<int> li;                class list; //int 版本
6Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!list<string> ls;             class list; //string 版本
7Jdk1.5中的泛型 (详细版) - dhxyu(海翔) - 专注Java,专注互联网!专注电子商务!list<double> ld;             class list; //double 版本    

这就造成了,在序列化后,Java不能分清楚原来的ArrayList是
ArrayList<Integer>还是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这样的泛型类,至于如何自定义泛型类,泛型方法请参见候捷先生的文章

  评论这张
 
阅读(1478)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017