25.1 概念
泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
Java语言引入泛型的好处是安全简单。
在java SE 1.5之前,没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换时要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
25.2 Java反射机制
见代码演示。
25.3 泛型优点
1、类型安全
2、向后兼容
3、层次清晰
4、性能较高,用GJ(泛型java)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。
25.4 泛型总结
如何解释泛型是什么?
泛型主要解决安全和代码重用的问题,有自动装箱和拆箱功能,可以用一个不确定的类型来表示任意一个类型,而且可以通过反射机制得到类的一系列信息,从而提高代码的优越性。
第一段演示代码如下:
1 /**日期:2016-03-08 2 * 功能:泛型的演示 3 */ 4 package test; 5 import java.util.*; 6 public class Demo1 { 7 8 public static void main(String[] args){ 9 // TODO Auto-generated method stub 10 11 //没有采用泛型会遇到的问题演示 12 ArrayList al1=new ArrayList(); 13 Dog dog1=new Dog(); 14 al1.add(dog1); 15 //取出ArrayList中的一个Dog对象 16 Dog temp1=(Dog)al1.get(0); 17 //但是如果程序员事先不知道ArrayList放入的是什么类, 18 //则下面这句代码也不会报错,但是很明显是不对的 19 Cat temp2=(Cat)al1.get(0); 20 21 //采用泛型 22 ArrayList<Dog> al2=new ArrayList<Dog>(); 23 Dog dog2=new Dog(); 24 al2.add(dog2); 25 //注意看,用了泛型的方法后,不需要再将得到的Object类强制转换成Dog类 26 Dog temp3=al2.get(0); 27 } 28 } 29 30 class Cat 31 { 32 private String color; 33 private int age; 34 } 35 class Dog 36 { 37 private String name; 38 private int age; 39 40 public String getName() { 41 return name; 42 } 43 public void setName(String name) { 44 this.name = name; 45 } 46 public int getAge() { 47 return age; 48 } 49 public void setAge(int age) { 50 this.age = age; 51 } 52 53 54 }
无输出结果:
第二段演示代码如下:
1 /**日期:2016-03-08 2 * 功能:泛型及java反射机制的演示 3 */ 4 package test; 5 import java.lang.reflect.Method; 6 import java.util.*; 7 public class Demo2 { 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 Gen<String> gen1=new Gen<String>("something"); 12 //打印出gen1的类名 13 gen1.showTypeName(); 14 15 Gen<Bird> gen2=new Gen<Bird>(new Bird()); 16 //打印出gen2的类名 17 gen2.showTypeName(); 18 System.out.println(); 19 gen2.showMethodsName(); 20 21 22 } 23 24 } 25 26 class Bird 27 { 28 //定义两个成员函数 29 public void test() 30 { 31 System.out.println("jijizhazha"); 32 } 33 public void count(int a,int b) 34 { 35 System.out.println(a+b); 36 } 37 } 38 39 //定义一个类 40 class Gen<T> 41 { 42 private T o; 43 //构造函数 44 public Gen(T o) 45 { 46 this.o=o; 47 } 48 //得到T的类型名 49 public void showTypeName() 50 { 51 System.out.println("类型是:"+this.o.getClass().getName()); 52 53 } 54 public void showMethodsName() 55 { 56 System.out.println(this.o.getClass().getName()+"类的成员函数有:"); 57 //通过java的反射机制 58 //可以得到T类的很多信息,比如得到成员函数名 59 //注意代码开头要引入java.lang.reflect.Method包 60 Method []m=this.o.getClass().getDeclaredMethods(); 61 //遍历打印出成员函数名 62 for (int i=0;i<m.length;i++) 63 { 64 System.out.println(m[i].getName()); 65 } 66 } 67 }
运行结果如下:
1 类型是:java.lang.String 2 类型是:test.Bird 3 4 test.Bird类的成员函数有: 5 count 6 test