国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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://m.qingdxww.cn/thread-60392-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲色图第四页| 天天躁狠狠躁夜躁2021| 日韩一区二区三区不卡视频| 午夜精品视频在线观看| 水野朝阳厨房系列在线观看| 亚洲精彩视频在线观看| 在线观看国产久青草| 高H内射NP古文| 777琪琪午夜理论电影网| 国产午夜精品不卡视频| 欧美怡红院视频一区二区三区| 亚洲AV永久无码精品老司机蜜桃| 色哟哟国产成人精品| 猪蜜蜜网站在线观看电视剧| 性久久久久久久| 人人模人人看| 羞羞色在线观看| 息孑性教育中文字幕| 中文字幕欧美一区| 国产小伙和50岁熟女23p| 亚洲精品乱码久久久久久直播 | 水蜜桃tv| 成人亚洲视频在线观看| 强奷乱码中文字幕熟女免费| 日韩精品欧美国产精品忘忧草| 婷婷色综合成人成人网小说| 日本成人免费| 亚洲自偷精品视频自拍| 亚洲欧美国产毛片在线| 俄罗斯一级毛片aaaa| 亚州性夜夜射在线观看| 亚洲无线码在线一区观看| 日本免费在线观看视频| 一级床片40分钟免费视频| 亚洲最大情网站在线观看| 国产成人无码一区AV在线观看| 秋霞电影午夜伦午夜| 亚洲日本中文字幕永久| 网站在线观看高清免费| 亚洲国产精品综合久久20| GAY空少被体育生开菊|