说实话自从走进Java的领域就觉得对语言的学习从语法到测试无非都是一样,我们现在要学的就是这些语言之间的一些差异。从学VB、VB.net、C#和一点C++一点C语言,再后来就是学Java。通过学习Java让我知道,编程语言的学习不再是表面层次的实现,而是深层次的基础底层的理解。作为一个菜鸟,在第一次次听说泛型的时候很头大,因为很害怕接受新东西,因为一旦接受了新东西,就意味着要改掉以前的习惯来适应新的知识。也许闭门造车说的就是我这样的人吧。
开头的一堆罗里吧嗦的话就只是为了引起我本篇文章对泛型初步理解的一些介绍,通过查阅一些资料和项目开发中的应用,希望对我们这些菜鸟有帮助,或得到更多人的指导和纠正。
泛型的理解
泛型是Java SE 1.5的新特性,它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。我们会用到泛型类、泛型接口、泛型方法。引入它的好处是安全简单,它的Java类型安全的一次重要改进。
泛型就是对对象进行操作的时候,不必考虑该对象的具体类型,对其他对象也可以进行同样的操作,这样就会显得很灵活。它的最佳用途就是实现一个通用的容器。这个容器可以存储对象,可以取出对象,但是不用考虑它是什么具体的类型。(泛型虽然有这样的好处,但是不能在它身上寄托太多,因为它也是有局限的)。
走进一个泛型和非泛型的世界
需求:我现在需要一个类的两个版本,一个是Integer和一个是String类型。
1 //没有用泛型的容器类或实体类NoFX.java 2 public class NoFX{ 3 private Object ob; 4 public NoFX(Object ob){ 5 this.ob=ob; 6 } 7 public Object getOb(){ 8 return ob; 9 } 10 public void setOb(Object ob){ 11 this.ob=ob; 12 } 13 public void showType(){ 14 System.out.println("T的实际类型是:" + ob.getClass().getName()); 15 } 16 }
1 //测试没有使用泛型的情况下怎么拿到两种类型的版本 NoFXDemo.java 2 public class NoFXDemo{ 3 public static void main(String[] args){ 4 //定义类NoFX的一个Integer版本 5 NoFX intOb=new NoFX(new Integer(520)); 6 intOb.showType(); 7 int i=(Integer)intOb.getOb(); 8 System.out.println("value="+i); 9 System.out.println("**********************************************"); 10 //定义NoFX的一个String版本 11 NoFX strOb=new NoFX("Hello FanXing"); 12 strOb.showType(); 13 String s=(String)strOb.getOb(); 14 System.out.println("value="+s); 15 System.out.println("**********************************************"); 16 } 17 }
1 //使用泛型的容器类或实体类 FX.java 2 public class FX<T> { 3 private T ob; //定义泛型成员变量 4 5 public FX(T ob) { 6 this.ob = ob; 7 } 8 9 public T getOb() { 10 return ob; 11 } 12 13 public void setOb(T ob) { 14 this.ob = ob; 15 } 16 17 public void showTyep() { 18 System.out.println("T的实际类型是: " + ob.getClass().getName()); 19 } 20 }
1 //测试使用泛型的情况下怎么拿到两种类型的版本 FXDemo.java 2 public class FXDemo { 3 public static void main(String[] args){ 4 //定义泛型类FX的一个Integer版本 在<>里放一个你需要的类型 5 FX<Integer> intOb=new FX<Integer>(520); 6 intOb.showTyep(); 7 int i= intOb.getOb(); 8 System.out.println("value= " + i); 9 System.out.println("**********************************************"); 10 //定义泛型类FX的一个String版本 在<>里放一个你需要的类型 11 FX<String> strOb=new FX<String>("Hello FanXing"); 12 strOb.showTyep(); 13 String s=strOb.getOb(); 14 System.out.println("value= " + s); 15 System.out.println("**********************************************"); 16 } 17 }
他们都一个共同的编译结果:
从上面两个例子可以看出,虽然两种方法都可以达到一样的目的,都拿到了两种类型的东西。但是明显第一种类型带有一些强制性。第二种就是泛型,就好像我新买了一个包,一开始我很喜欢它,所以我就用它来装一些钱包手机什么的,后来包包有点旧了,我就直接拿来去装菜了,这就是生活中的泛型。如果不用泛型,就好像我买了一个钱包,我定义这个钱包是用来装钱的,所以只要从里面拿出东西来就一定钱!如果我把这个钱包定义成泛型,那我就可以从中取出金子银子花花绳子来(当然你得金子转化成金子,如果花花绳子转化成金子就会出错的,你想的美)~~~~~~~~~~话说泛型虽好,但是想到以后的编程中会出现很多的<>就稍微觉得Disgusting~~~~~~~~