一個 Generic問題
一個 Generic問題?
來自 http://blog.csdn.net/zhangxiaoxiang/archive/2006/11/07/1372076.aspx?Pending=true
下面程序的main方法中的第二行代碼和注釋中的兩行代碼表達的意思完全相同,注釋中的兩行代碼不能通過編譯(這很容易理解),而第二行(采用方法調用鏈)卻可以順利通過編譯(這就很難理解了)。




























我把這段程序調試了一下





































下面的代碼
?? Object obj = new Test();
???? //下面這行可以成功編譯??
??? ((Test)obj).getClass().newInstance().func();
javap之后
public static void main(java.lang.String[])?? throws java.lang.Exception;
? Code:
?? 0:?? new???? #5; //class Test
?? 3:?? dup
?? 4:?? invokespecial?? #6; //Method "<init>":()V
?? 7:?? astore_1
?? 8:?? aload_1
?? 9:?? checkcast?????? #5; //class Test
?? 12:? invokevirtual?? #7; //Method java/lang/Object.getClass:()Ljava/lang/Class;
?? 15:? invokevirtual?? #8; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
?? 18:? checkcast?????? #5; //class Test
?? 21:? invokevirtual?? #9; //Method func:()V
?? 24:? return
}
???
??? ((Test)c.newInstance()).func();
?? 52:? invokevirtual?? #16; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
?? 55:? checkcast?????? #5; //class Test
virtualf?發表于2006-11-08 14:19:00??IP: 222.209.220.*
((Test)obj).getClass().newInstance().func();
<=>
((Test)(obj.getClass().newInstance())).func();
可以反編譯后查看.
//的確如此。
???? Object obj = new Test();
???? Class < ? extends Test> c = ((Test)obj).getClass();
?????? c.newInstance().func();
??
??
?? 9:?? checkcast?????? #5; //class Test
?? 12:? invokevirtual?? #7; //Method java/lang/Object.getClass:()Ljava/lang/Class;
?? 15:? astore_2
?? 16:? aload_2
?? 17:? invokevirtual?? #8; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
?? 20:? checkcast?????? #5; //class Test
?? 23:? invokevirtual?? #9; //Method func:()V
?? 26:? return
}
? Class < ? extends Test> c = ((Test)obj).getClass();
? System.out.println();?
? Test? ff=? c.newInstance();//.func();
就無需轉換?.直接拿到對象了.
?
getClass
public final Class<? extends Object> getClass()
當系統認為 class 變量 < 來自那個類的class >
通過 class 變量.newInstance; 被賦予了 那個類的類型.
posted on 2006-11-08 16:16 小高 閱讀(269) 評論(0) 編輯 收藏 所屬分類: java基礎