java中泛型的使用

来源:互联网 发布:开源财务系统 php 编辑:程序博客网 时间:2024/06/01 09:24

泛型的使用对于代码质量的提高有很多作用。泛型可以增加程序的可读性,可以使代码得到一定程度的复用。不使用泛型时,如果是装入集合操作,那么元素都被当做Object对待,失去自己的类型,那么从集合中取出来时, 往往需要转型,效率低,容易产生错误。
下面看一段比较全面的泛型代码:

package com.ds.test.all;import java.util.ArrayList;public class FanXin <E>{    public E pro1;    public <T> E getName(T a){        if(a instanceof Integer){            System.out.println("a is Integer");        }else if (a instanceof String) {            System.out.println("a is String");        }        return pro1;    }    public void getAge(ArrayList<? extends Number> al){        for(int i = 0;i<al.size();i++){            System.out.println(al.get(i).getClass());        }    }    public static void main(String arg[]){        FanXin<String> s = new FanXin<String>();        FanXin<Integer> s2 = new FanXin<Integer>();        s.getName(1);        s.getName("1");//泛型类型可以接受不同的参数类型        ArrayList<Number> al1 = new ArrayList<Number>();        al1.add(1L);        al1.add(1);        s.getAge(al1);//只需要满足是Number或者其子类        System.out.println(s.getClass() == s2.getClass());//此处可以看出java编译之后会去掉泛型    }}

这个类基本上包括了大多数常用的场景,使用方法基本上都可以从这个类上延伸开来。首先,类使用了泛型,类名上声明了这个泛型,那么该类的所有成员变量和成员方法都可以使用该泛型。本例中定义了一个使用该泛型的成员变量,还有一个扩展之后的成员方法。当在方法中需要引入新的泛型时,需要在方法返回值钱声明这个新的泛型即:<T>,那么就可以在你的参数中增加该泛型。接下来的方法getAge(…)展示了使用通配符来使用泛型,表示al这个集合中接收的参数必须是Number或其子类。
下面看一看输出结果:

a is Integera is Stringclass java.lang.Longclass java.lang.Integertrue

第一行、第二行的记过应该很好明白。第三行、第四行也不难理解,通配符的使用情况。第五行说明了在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。编译之后的文件如下图。这里写图片描述

1 0
原创粉丝点击