學習筆記之泛型

.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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章