`
chenjunxi520
  • 浏览: 7625 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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<String> list的内容序列化,然後再读取出来,在使用的过程中会发现出错,
为什么呢?用Stream读取一下回来的数据,你会发现<String>不见了,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<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这样的泛型类,至于如何自定义泛型类,泛型方法请参见候捷先生的文章

本文大部份内容来自候捷写的jdk1.5泛型的文章http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf  向他致敬。

分享到:
评论

相关推荐

    JDK1.5新特性泛型_深入研究.doc

    JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究

    jdk1.5的新特性泛型的实例代码

    jdk1.5的新特性泛型的实例代码,很好的学习资料

    详细介绍JDK1.5的各种新特性

    “JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入

    jdk1.5新特性关于动态参数,泛型等

    Java的泛型和动态参数,以及for循环的使用Connections类的详解,list,set的详解

    详细描述jdk1.5新特性

    jdk1.5新特性 泛类型和泛型方法是Java5.0 中的新特性。一种泛类型用一个或多个泛型变量定义,可以有一个或多个,泛型变量做参数占位符或做返回值 的方法。

    jdk1.5新特性,泛型,for:each

    jdk1.5新特性,泛型,for:each

    Jdk1_5中的新特性 --泛型 (详细版)

    容器不能放基类型不好,接着说泛型没用。而恰恰Jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型

    jdk1.5后的特性.rar

    jdk1.5的以后的技术,例如泛型,枚举,注释的基本使用方法,给刚学习java的朋友一些不错的介绍

    jdk 1.5新特性笔记

    jdk 1.5新特性笔记,泛型,注释等程序

    jdk1.5的新特性

    从增强的for循环到诸如泛型(generic)之类更复杂的特性,都将很快出现在您所编写的代码中。我们刚刚完成了一个基于Java 5.0的大型任务,而本文就是要介绍我们使用这些新特性的体验。本文不是一篇入门性的文章,而是对...

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    今天,JDK1.5終於內建泛型特性,不僅編譯器不再需要 任何外力(外掛附件)的幫助,整個 Java標準程式庫也被翻新(retrofit),許多 角落針對泛型做了改寫。 讓我們把帶有「參數化型別」(parameterized types)的 ...

    JDK1.5新特性介绍

    “JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的...

    jdk1.5.0.08 wini586

    安装包,的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。

    jdk-1_5_0_10-windows-i586-p.exe

    JDK1.5安装包,JDK1.5的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。

    jdk1.5.0_10

    jdk1.5新特性 1.泛型 2.foreach 3.自动拆箱装箱 4.枚举 5.静态导入(Static import) 6.元数据(Metadata) 7.线程池 8.Java Generics

    知识总结\泛型.doc

    泛型是jdk1.5之后的java新特性,这里有详细的解析,希望对大家有用

    JAVA5新特性介绍.zip

    JDK1.5新特性:自动拆装箱、泛型、增强for循环、静态方法导入、可变参数、枚举

    java进阶技术:泛型、反射、注解

    泛型是Java SE 1.5的新特性,好处是在...注解(Annotation)是JDK1.5及以后引入的新特性,与类、接口、枚举是在同一个层次。可声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明,注释。

    Java泛型的基本应用

     jdk1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。  好处:  1,将运行时期的问题ClassCastException转到了编译时期。  2,避免了强制转换的麻烦。  什么时候用:  当操作的引用数据...

    JavaSE 笔记(基础我介绍)

    1. 基础:JDK,classpath,流,线程 2. java 1.5特性:注解、泛型等 3. 反射 4. 集合框架 5. 内省 6. 类加载器 8. 代理模式和面向切面编程 部分内容有代码 以上内容均为个人学习总结,可做为工具或学习使用

Global site tag (gtag.js) - Google Analytics