转自 http://www.cnblogs.com/justinli/p/generic.html
一、泛型的基本概念
java与C#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk1.5以后出现的。java中泛型与C#中的泛型是有本质区别的: 首先从集合类型上来说,java中的ArrayList<Integer>和ArrayList<String>是同一个类型,在编译时会执行类型檫除,即java中的类型是伪泛型;其次,对于向集合中添加基本类型的数据时,例如int,会首先将int转换成Integer对象,即我们通常所说的装箱操作,在取出元素的时候需要将Integer对象转换成int值类型,即拆箱操作。而在C#中,List<int>和List<String>是不同的泛型,泛型参数在编译后会是一个占位符,并没有被檫除,在运行时被赋予真正的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现成为类型膨胀(针对类型膨胀,即时编译器已经做了很多优化工作来解决这一问题),这就是所谓的真泛型,与此同时,在对集合中添加基本类型如int时,不需要装箱操作,取出元素时不需要拆箱操作,因此,性能上较java的集合泛型要好。
二、为什么使用泛型
java中泛型的引入主要为了解决两个问题:
1、集合类型元素在运行时出现类型转换异常,增加编译时的类型检查;
2、解决重复代码的编码,能够复用算法;