我只想當個程序員
一個 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 Testvirtualf?發表于2006-11-08 14:19:00??IP: 222.209.220.*
//的確如此。 ???? 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();
public final Class<? extends Object> getClass()當系統認為 class 變量 < 來自那個類的class > 通過 class 變量.newInstance; 被賦予了 那個類的類型.
posted on 2006-11-08 16:16 小高 閱讀(267) 評論(0) 編輯 收藏 所屬分類: java基礎