学习笔记之泛型
.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);