Java 泛型详解

来源:互联网 发布:红蜘蛛教学软件介绍 编辑:程序博客网 时间:2024/04/27 00:10

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

总结,泛型从设计者角度来说,可以让自己的代码更通用,给使用者提供一个减少犯错的机会。从使用者角度来说,我利用泛型 ,可以让自己少犯错嘛。