国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

Java語(yǔ)言基礎(chǔ):泛型

發(fā)布時(shí)間:2011-3-29 20:08    發(fā)布者:1770309616
關(guān)鍵詞: Java語(yǔ)言基礎(chǔ) , 泛型
Java語(yǔ)言基礎(chǔ).pdf (205.39 KB)


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

    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是一個(gè)泛型類,DrawShape方法繪制一個(gè)圖形,從使用C++模板的經(jīng)驗(yàn)來(lái)看,這絕對(duì)是正確的,但Java居然出現(xiàn)編譯錯(cuò)誤了:shape.Draw這樣調(diào)用不被允許。
    我再把代碼修改了一下:
    class Drawer {
        public void DrawShape(T shape) {
            shape.toString();
        }
    }
    這樣就編譯通過(guò)了,看來(lái)Java是把 T 解釋成 Object 了,有沒(méi)有辦法讓它解釋成Shape呢,又看了一下文檔,才知道要這樣寫:
    class Drawer {
        public void DrawShape(T shape) {
            shape.Draw();
        }
    }
    原來(lái)類型參加也可以指定繼承的,如果是這樣,那和不用泛型的代碼有什么區(qū)別呢:    class Drawer {
        public void DrawShape(Shape shape) {
            shape.Draw();
        }
    }
    看來(lái)Java的泛型和C++的模板有很大的區(qū)別,Java的泛型更多的是用于容器,并且在我看來(lái),它的最大作用是省去類型轉(zhuǎn)換的操作,并且在編譯期檢查一下類型是否正確,傳統(tǒng)容器類可能要這樣寫:
     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);

    我還注意到泛型參數(shù)不能是基本類型,只能是對(duì)象,這跟C++的模板差距又進(jìn)一步拉大了。感覺(jué)Java泛型的作用并不是很大,但又搞得很復(fù)雜,比如通配符這種東西,先看下面的代碼:
    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這一句編譯不過(guò),因?yàn)長(zhǎng)ist與List不兼容,怎么改呢,用通配符:
    private static void PrintList(List list) {
        for (Object o: list) {
            System.out.println(o.toString());
        }
    }
    List 的意思是列表的元素類型未知,但變成Object總是沒(méi)有問(wèn)題的,所以可以編譯通過(guò),現(xiàn)在如果我想它是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,我已經(jīng)快被搞暈了,它的意思是List的項(xiàng)必須是Shape或繼承自Shape,搞了一圈又回到使用多態(tài)就可以解決問(wèn)題了。
    但這個(gè)用法又帶來(lái)了一些限制,就是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())這句編不過(guò),因?yàn)閹в型ㄅ浞募项悾静荒艽_定它的元素是什么類型。
    個(gè)人覺(jué)得Java不要泛型的好,因?yàn)闆](méi)有一定要用它的理由啊,它只可以幫你自動(dòng)轉(zhuǎn)換和檢查一下類型,但它所帶來(lái)的語(yǔ)法復(fù)雜性,其實(shí)是得不償失的。
本文地址:http://m.4huy16.com/thread-60392-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)上海首站開(kāi)幕
  • 技術(shù)熱潮席卷三城,2025 Microchip中國(guó)技術(shù)精英年會(huì)圓滿收官!
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國(guó)技術(shù)精英年會(huì)深圳站回顧
  • Microchip第22屆中國(guó)技術(shù)精英年會(huì)——采訪篇
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表