泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
java语言引入泛型的好处就是安全简单。
在Java SE 1.5之前,没有泛型的情况下,通过对类型Object的引用来实现参数的”任意化“,”任意化“带来的缺点是要做显式的强制类型转换,而这种转换时要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
public class Test { public static void main(String args[]) { ArrayList<Dog> al = new ArrayList<Dog>(); Dog dog1 = new Dog(); al.add(dog1); //Dog temp = (Dog) al.get(0);//强制转换 //Cat temp=(Cat)al.get(0);//无误,但在编译发生类型错误 Dog temp=al.get(0); } } class Cat{ private String color; private int age; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Dog { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
java的反射机制源码
import java.lang.reflect.Method; public class Test { public static void main(String args[]) { /*Gen<String> gen1=new Gen<String>("aaa"); gen1.showTypeName(); Gen<Integer> gen2=new Gen<Integer>(1); gen2.showTypeName();*/ Gen<Bird> genBird=new Gen<Bird>(new Bird()); genBird.showTypeName(); } } class Bird{ public void test1(){ System.out.println("aa"); } public void count(int a,int b){ System.out.println(a+b); } } class Gen<T>{ private T o; public Gen(T a){ o=a; } public void showTypeName(){ System.out.println("类型是:"+o.getClass().getName()); Method method[]=o.getClass().getDeclaredMethods(); for (int i=0;i<method.length;i++) { System.out.println("成员方法:" + method[i].getName()); } } }
执行结果:
类型是:demo.com.Bird
成员方法:count
成员方法:test1
泛型的有点:
①类型安全;
②向后兼容;
③层次清晰;
④性能较高,用GJ(泛型java)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。