JUST DO IT ~

          我只想當個程序員

          一個 Generic問題

          一個 Generic問題?
          來自 http://blog.csdn.net/zhangxiaoxiang/archive/2006/11/07/1372076.aspx?Pending=true

          下面程序的main方法中的第二行代碼和注釋中的兩行代碼表達的意思完全相同,注釋中的兩行代碼不能通過編譯(這很容易理解),而第二行(采用方法調用鏈)卻可以順利通過編譯(這就很難理解了)。

          public ? class ?Test
          {
          ????
          public ? void ?func()
          ????
          {
          ?????????System.out.println(
          " func " );
          ???}

          ?
          ???
          public ? static ? void ?main(String?args[])? throws ?Exception
          ???
          {
          ???????????Object?obj?
          = ? new ?Test();

          ???????????
          // 下面這行可以成功編譯??
          ???????????((Test)obj).getClass().newInstance().func();

          ???????????
          // 下面這兩行無法通過編譯
          ??????????? /* Class?c?=?((Test)obj).getClass();
          ???????????c.newInstance().func();?
          */

          ???
          ?}

          }
          ?


          我把這段程序調試了一下


          public?class?Test
          {
          ????
          public?void?func()
          ????
          {
          ?????????System.out.println(
          "func");
          ???}

          ?
          ???
          public?static?void?main(String?args[])?throws?Exception
          ???
          {
          ???????????Object?obj?
          =?new?Test();

          ???????????
          //下面這行可以成功編譯??
          ???????????((Test)obj).getClass().newInstance().func();

          ???????????
          //下面這兩行無法通過編譯
          ???????????
          ???????????
          ???????????
          //下面這兩行無法通過編譯
          ???????????/*Class?c?=?((Test)obj).getClass();
          ???????????c.newInstance().func();?
          */


          ???????????
          ?????????Class?
          <???extends?Test>?c?=?((Test)obj).getClass();
          ?????????
          //因為Generic,?編譯器可以在編譯期獲得類型信息所以可以編譯這類代碼。你將下面那兩行改成?

          ???????????c.newInstance().func();?
          ???
          ?}

          }
          ?







          下面的代碼
          ?? 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基礎

          導航

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(352)

          收藏夾(19)

          關注的blog

          手冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 改则县| 通榆县| 鹤峰县| 濉溪县| 洪洞县| 永宁县| 桦川县| 乌恰县| 茂名市| 墨玉县| 大埔县| 施甸县| 富裕县| 凉山| 石家庄市| 南阳市| 自贡市| 连城县| 梨树县| 阿克陶县| 莎车县| 英吉沙县| 清新县| 仙居县| 涞源县| 加查县| 泗阳县| 桓仁| 商城县| 务川| 拜泉县| 类乌齐县| 武清区| 闵行区| 四川省| 佛坪县| 怀安县| 上杭县| 河南省| 茂名市| 从化市|