<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    Java語言基礎:泛型

    發布時間:2011-3-29 20:08    發布者:1770309616
    關鍵詞: Java語言基礎 , 泛型
    Java語言基礎.pdf (205.39 KB)


    日常開發主要是C++和Delphi,使用Java完全是為了開發Android應用。今天在看Java的泛型,有些方面感到很奇怪,先來看下面的代碼:

        class Shape {
            public void Draw() {
                System.out.println("Draw Shape");
            }
        }
        class Rect extends Shape {   
            @Override
            public void Draw() {
                System.out.println("Draw Rect");
            }
        }
        class Line extends Shape {
            @Override
            public void Draw() {
                System.out.println("Draw Line");
            }
        }
        class Drawer {
            public void DrawShape(T shape) {
                shape.Draw();
            }
        }
        Drawer是一個泛型類,DrawShape方法繪制一個圖形,從使用C++模板的經驗來看,這絕對是正確的,但Java居然出現編譯錯誤了:shape.Draw這樣調用不被允許。
        我再把代碼修改了一下:
        class Drawer {
            public void DrawShape(T shape) {
                shape.toString();
            }
        }
        這樣就編譯通過了,看來Java是把 T 解釋成 Object 了,有沒有辦法讓它解釋成Shape呢,又看了一下文檔,才知道要這樣寫:
        class Drawer {
            public void DrawShape(T shape) {
                shape.Draw();
            }
        }
        原來類型參加也可以指定繼承的,如果是這樣,那和不用泛型的代碼有什么區別呢:    class Drawer {
            public void DrawShape(Shape shape) {
                shape.Draw();
            }
        }
        看來Java的泛型和C++的模板有很大的區別,Java的泛型更多的是用于容器,并且在我看來,它的最大作用是省去類型轉換的操作,并且在編譯期檢查一下類型是否正確,傳統容器類可能要這樣寫:
         List intList = new ArrayList();
         intList.add(new Integer(10));
         Integer i = (Integer)intList.get(0);
    有了泛型以后可以改成這樣寫:
         List intList = new ArrayList();
         intList.add(new Integer(10));
         Integer i = intList.get(0);

        我還注意到泛型參數不能是基本類型,只能是對象,這跟C++的模板差距又進一步拉大了。感覺Java泛型的作用并不是很大,但又搞得很復雜,比如通配符這種東西,先看下面的代碼:
        private static void PrintList(List list) {
            for (Object o: list) {
                System.out.println(o.toString());
            }
        }
        public static void DoTest() {
             List intList = new ArrayList();
             intList.add(new Rect());
             intList.add(new Rect());
             intList.add(new Rect());
             PrintList(intList);
        }
        PrintList這一句編譯不過,因為List與List不兼容,怎么改呢,用通配符:
        private static void PrintList(List list) {
            for (Object o: list) {
                System.out.println(o.toString());
            }
        }
        List 的意思是列表的元素類型未知,但變成Object總是沒有問題的,所以可以編譯通過,現在如果我想它是Shape,該怎么辦呢,用通配符再加Extends的辦法:
        class Shape {
            public String getName() {
                return "Shape";
            }
        }
        class Rect extends Shape {   
            @Override
            public String getName() {
                return "Rect";
            }
        }
        public class TestGenerics {
            private static void PrintList(List list) {
                for (Shape s: list) {
                    System.out.println(s.getName());
                }
            }
            public static void DoTest() {
                 List intList = new ArrayList();
                 intList.add(new Rect());
                 intList.add(new Rect());
                 intList.add(new Rect());
                 PrintList(intList);
            }
        }
        看看List list,我已經快被搞暈了,它的意思是List的項必須是Shape或繼承自Shape,搞了一圈又回到使用多態就可以解決問題了。
        但這個用法又帶來了一些限制,就是List list中的list是不能增加刪除元素的,比如:  
        private static void PrintList(List list) {
            for (Shape s: list) {
                System.out.println(s.getName());
            }
            list.add(new Line());
        }
        list.add(new Line())這句編不過,因為帶有通配符的集合類,根本不能確定它的元素是什么類型。
        個人覺得Java不要泛型的好,因為沒有一定要用它的理由啊,它只可以幫你自動轉換和檢查一下類型,但它所帶來的語法復雜性,其實是得不償失的。
    本文地址:http://www.portaltwn.com/thread-60392-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷