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