java泛型

泛型自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);
}

 

posted on 2013-06-03 11:41  大松  阅读(179)  评论(0编辑  收藏  举报