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?發(fā)表于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()






          當系統(tǒng)認為 class 變量 < 來自那個類的class >
          通過 class 變量.newInstance; 被賦予了 那個類的類型.

          posted on 2006-11-08 16:16 小高 閱讀(271) 評論(0)  編輯  收藏 所屬分類: java基礎

          導航

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

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類(352)

          收藏夾(19)

          關注的blog

          手冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泸定县| 比如县| 怀仁县| 咸阳市| 揭阳市| 华容县| 安康市| 扬州市| 南雄市| 黄陵县| 朝阳县| 巴彦淖尔市| 宁夏| 双牌县| 岳阳市| 清流县| 平原县| 漳平市| 汾阳市| 三穗县| 大竹县| 临邑县| 张家川| 桃江县| 天津市| 碌曲县| 永丰县| 永宁县| 安远县| 客服| 永城市| 林周县| 孝昌县| 静安区| 英德市| 尖扎县| 阿合奇县| 本溪市| 肥西县| 平湖市| 上虞市|