<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 小高 閱讀(267) 評論(0)  編輯  收藏 所屬分類: java基礎

    導航

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

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(352)

    收藏夾(19)

    關注的blog

    手冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费阿v网站在线观看g| igao激情在线视频免费| 91免费国产在线观看| 久久久久亚洲AV成人片| 丝袜足液精子免费视频| 亚洲精品无码专区久久久| 99免费精品视频| 内射少妇36P亚洲区| 亚洲综合免费视频| 国产精品亚洲四区在线观看| 久草在视频免费福利| 在线观看日本亚洲一区| 国产高清在线精品免费软件 | 国产麻豆剧传媒精品国产免费| 在线aⅴ亚洲中文字幕| 免费观看四虎精品国产永久| 成年大片免费视频播放一级| 久久久青草青青国产亚洲免观| 久久性生大片免费观看性| 亚洲邪恶天堂影院在线观看| 久草视频在线免费| 亚洲av永久无码精品网址| 免费又黄又爽的视频| 免费精品一区二区三区第35| 久久久久se色偷偷亚洲精品av| 日韩成人在线免费视频| 国产精品无码永久免费888| 亚洲毛片在线观看| 日韩视频在线免费| 免费萌白酱国产一区二区三区| 亚洲中文字幕无码av在线| 免费中文字幕在线| 小草在线看片免费人成视久网| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲国产成人五月综合网| 久操免费在线观看| 亚洲欧美aⅴ在线资源| 久久精品国产亚洲综合色| 在线免费视频一区二区| 一个人免费视频观看在线www| 最新国产成人亚洲精品影院|