读书人

学习札记之泛型

发布时间: 2012-10-21 09:00:07 作者: rapoo

学习笔记之泛型
.NET泛型,涉及到CLR和内存模型的修改;JAVA,直接在bytecode层完事


JAVA的泛型,绝对的语法糖,高级编译后,都擦除了类型。比如ArrayList<Apple>的add方法,仍然是Method java/util/ArrayList.add:(Ljava/lang/Object;)Z。get方法,仍然是Method java/util/ArrayList.get:(I)Ljava/lang/Object;,同时增加了强制转换语句checkcast。用javap很容易发现。


JAVA定义个泛型类,类型还是被擦除。比如

1. public void set(K value) {},生成的bytecode为 public void set(java.lang.Object);

2. public K get() { return null; },生成的bytecode为public java.lang.Object get();


看get和set的调用代码,分别为Method example/holding/GenericApple.set:(Ljava/lang/Object;)V 和 Method example/holding/GenericApple.get:()Ljava/lang/Object; checkcast


看JRE中的ArrayList的bytecode,执行命令:

javap -classpath D:\jdk1.5.0_12\jre\lib\rt.jar -c java.util.ArrayList >> ArrayList.bc

查看ArrayList.bc,看get:public java.lang.Object get(int); 看add: public boolean add(java.lang.Object);

读书人网 >编程

热点推荐