泛型自J2SE 1.5引入。
编译环境sun jdk 1.6
class Generic<T>{ T obj; public Generic(T obj){ this.obj = obj; } public T getObj(){ return this.obj; } }
执行'javac Generic.java',产生class文件Generic.class。
执行'javap -classpath xxx Generic'打印出反编译信息:
a@ubuntu:javap -classpath ~/temp Generic Compiled from "Generic.java" class Generic extends java.lang.Object{ java.lang.Object obj; public Generic(java.lang.Object); public java.lang.Object getObj(); }
泛型被编译为字节码后,被Object类型替代。这就是java泛型使用的类型“擦除”机制,目的是为了保持对jdk1.5之前的兼容性。
有界类型:
//###########extends########### a@h:~/temp$ cat GenericExtends.java class GenericExtends<T extends Number>{ T obj; public GenericExtends(T obj){ this.obj = obj; } public T getObj(){ return this.obj; } } a@h:~/temp$ javap -classpath ~/temp GenericExtends Compiled from "GenericExtends.java" class GenericExtends extends java.lang.Object{ java.lang.Number obj; public GenericExtends(java.lang.Number); public java.lang.Number getObj(); } //###########super########### a@h:~/temp$ cat GenericSuper.java import java.util.List; class GenericSuper{ private List<? super Double> list; public GenericSuper(){ } public void setList(List<? super Double> list){ this.list = list; } } a@h:~/temp$ javap -private -classpath ~/temp GenericSuper Compiled from "GenericSuper.java" class GenericSuper extends java.lang.Object{ private java.util.List list; public GenericSuper(); public void setList(java.util.List); }