本来只转载了个链接,和一个简单的使用程序,但昨天不小心看到有人批判jdk1.5,先说java要强制转型不好的问题没解决,
容器不能放基类型不好,接着说泛型没用。而恰恰Jdk1.5中解决了这些问题,所以感叹之余,把这篇文章改一下,详细的说说泛型。
		一,Java中的泛型:
在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的
内容是任何Object,所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢?
而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是
无从发现的。所以jdk1.5中提供了泛型,这个泛型其实是向c++靠拢了.好,我们先看几个实例再细说原理。
		二,泛型的用法:(多个实例)
		
				1
				 实例A
				实例A
				2
				
						 ArrayList
				<
				String
				>
				 strList 
				=
				 
				new
				 ArrayList
				<
				String
				>
				();
ArrayList
				<
				String
				>
				 strList 
				=
				 
				new
				 ArrayList
				<
				String
				>
				();
				3
				
						 strList.add(
				"
				1
				"
				);
strList.add(
				"
				1
				"
				);
				4
				
						 strList.add(
				"
				2
				"
				);
strList.add(
				"
				2
				"
				);
				5
				
						 strList.add(
				"
				3
				"
				);
strList.add(
				"
				3
				"
				);
				6
				
						 //
				关键点(1) 注意下边这行,没有强制转型
				
				//
				关键点(1) 注意下边这行,没有强制转型
				
						
				
				7
				
						 String str 
				=
				 strList.get(
				1
				);
				
				String str 
				=
				 strList.get(
				1
				);
				8
				
						 //
				关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好
				
				//
				关键点(2)然後我们加入,这个时候你会发现编译器报错,错误在编译器被发现,错误当然是发现的越早越好
				
						
				
				9
				
						 strList.add(
				new
				 Object());
				
				strList.add(
				new
				 Object());
		 
		
		
				1
				 实例B
				实例B
				2
				
						 ArrayList
				<
				Integer
				>
				 iList 
				=
				 
				new
				 ArrayList
				<
				Integer
				>
				();
ArrayList
				<
				Integer
				>
				 iList 
				=
				 
				new
				 ArrayList
				<
				Integer
				>
				();
				3
				
						 //
				关键点(3) 注意直接把整数放入了集合中,而没有用Integer包裹
				
				//
				关键点(3) 注意直接把整数放入了集合中,而没有用Integer包裹
				
						
				
				4
				
						 iList.add(
				1
				);
				
				iList.add(
				1
				);
				5
				
						 iList.add(
				2
				);
iList.add(
				2
				);
				6
				
						 iList.add(
				3
				);
iList.add(
				3
				);
				7
				
						 //
				关键点(4)同样直接取出就是int
				
				//
				关键点(4)同样直接取出就是int
				
						
				
				8
				
						 int
				 num 
				=
				 iList.get(
				1
				);
				
				int
				 num 
				=
				 iList.get(
				1
				);
		 
		
		
				1
				 实例C
				实例C
				2
				
						 //
				关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。
				
				//
				关键点(5)展示一下key-value的时候要怎么写,同时key和value也可以是基本类型了。
				
						
				
				3
				
						 HashMap
				<
				Integer,Integer
				>
				 map 
				=
				 
				new
				 HashMap
				<
				Integer,Integer
				>
				();
				
				HashMap
				<
				Integer,Integer
				>
				 map 
				=
				 
				new
				 HashMap
				<
				Integer,Integer
				>
				();
				4
				
						 map.put(
				1
				, 
				11
				);
map.put(
				1
				, 
				11
				);
				5
				
						 map.put(
				2
				, 
				22
				);
map.put(
				2
				, 
				22
				);
				6
				
						 map.put(
				3
				, 
				33
				);
map.put(
				3
				, 
				33
				);
				7
				
						 int
				 inum 
				=
				 map.get(
				1
				);
				
				int
				 inum 
				=
				 map.get(
				1
				);
				8
				
						 
				
		 
		三,看完了实例了,详细来说说为什么吧
首先jdk1.5中的泛型,第一个解决的问题,就是Java中很多不必要的强制转型了,具体的实现,我们以ArrayList
为例,下边是ArrayList中的片断代码:
 1 ArrayList类的定义,这里加入了<E>
ArrayList类的定义,这里加入了<E>
 2 public class ArrayList<E> extends AbstractList<E>
public class ArrayList<E> extends AbstractList<E>
 3 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 4
 5 //get方法,返回不再是Object 而是E
//get方法,返回不再是Object 而是E
 6
 public E get(int index)
public E get(int index)  {
{
 7 RangeCheck(index);
    RangeCheck(index);
 8 return elementData[index];
    return elementData[index];
 9 }
}
10 //add方法,参数不再是Object 而是E
//add方法,参数不再是Object 而是E
11
 public boolean add(E o)
public boolean add(E o)  {
{
12 ensureCapacity(size + 1);  // Increments modCount!!
    ensureCapacity(size + 1);  // Increments modCount!!
13 elementData[size++] = o;
    elementData[size++] = o;
14 return true;
    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的实现类只有一个。
1 ArrayList<Integer>
ArrayList<Integer>   .;   public class ArrayList
.;   public class ArrayList
2 ArrayList<String>
ArrayList<String>   ..;   --同上--
..;   --同上--
3 ArrayList<Double>
ArrayList<Double>   ..;   --同上--
..;   --同上--
4 而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
而C++采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现,实现类有多个
5 list<int> li;                class list; //int 版本
list<int> li;                class list; //int 版本
6 list<string> ls;             class list; //string 版本
list<string> ls;             class list; //string 版本
7 list<double> ld;             class list; //double 版本
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这样的泛型类,至于如何自定义泛型类,泛型方法请参见候捷先生的文章
本文大部份内容来自候捷写的jdk1.5泛型的文章http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf  向他致敬。
# 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~~~~~~  回复  更多评论