Java 泛型详解
之前学习泛型后,当时印象很深刻,以为不会忘记,就没有做记录,结果到头来发现自己还是太年轻啊,忘得差多了。这不又花了半个小时重新捡起来,还是乖乖自己做个笔记,然后去应用它,这样才不会忘记呢。
为什么 sun 公司要设计泛型这种技术呢?
如果你学习过 Java 中的集合框架,就知道这些容器可以存放任意类型的对象,这当然是为了让程序有更好的扩展性。
那你有没有想过其内部是怎么用代码实现的呢?内部是用 object 类来声明变量类型嘛,因为它是任何对象的爸爸啊。
那么现在就涉及到向上转型和向下转型的问题,当对象装进容器后,其实实现了向上转型,也就是说他失去了自己的特性,当我们重新把它取出来时,就需要向下转型,重新让它获得自己的特性。而频繁的类型转换,势必就会出错,而这种错误偏偏又是运行时期的错误,让码农苦不堪言啊。
所以, sun 公司就设计出了泛型这种技术,sun 就和 java 编译器商量,希望它 能够堵住这个错误,在编译时期就把它揪出来,而不要放任这个错误到运行时期。抢占 Java 虚拟机的地盘啊,这就是泛型出现的原因。
如何使用已经采用了泛型技术的类呢?
这里我们以 HashMap 容器为例,体验一下,怎么用别人设计好的,已经使用了泛型技术的类,稍后再自己设计一个使用泛型技术的类工其他人使用。
@Test
public void test(){
//这是程序员A 在设计容器
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1, "aaa");
map.put(2, "bbb");
map.put(3, "ccc");
//假设这是另一个程序员B 在取数据,由于A使用了泛型,B取得过程中就会得到 IDE 的提示,一旦写错, IDE 还会报错。
Set<Map.Entry<Integer, String>> set= map.entrySet();
for(Map.Entry<Integer, String> entry : set){
System.out.println(entry.getKey() + ":"+ entry.getValue());
}
}
泛型技术的使用,极大的提高了程序的健壮性,减少了程序员工作可能犯的错误。
如何自己设计一个采用泛型技术的类,供他人使用呢?
设计的过程,还能发现泛型的另一个好处,就是让代码更加通用,提高了代码的复用性。
首先,先设计一个使用泛型技术的方法
//参数能够使用泛型,是因为,前面声明了泛型。这个方法很明显可以将任意类型的,相同性质的元素交换。
public <T> void swap(T t1,T t2){
T temp;
temp = t1;
t1 = t2;
t2 = temp;
}
那如果一个类中有几个地方都需要使用泛型,可不可以把声明泛型提到类中,变成一个全局声明的呢?当然可以啊。
这样声明就可以了
//其实就是把声明部分放到类名前面就可以了,使用时,和上述 HashMap 是一样的。
public class TestGeneric <T>{
public void swap(T t1,T t2){
T temp;
temp = t1;
t1 = t2;
t2 = temp;
}
}
这里有一个使用泛型技术来实现顺序表的例子,可以参考:
http://blog.csdn.net/keqiwww/article/details/75174909
总结,泛型从设计者角度来说,可以让自己的代码更通用,给使用者提供一个减少犯错的机会。从使用者角度来说,我利用泛型 ,可以让自己少犯错嘛。