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

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

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

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    “泛型Java”,一個美麗的hype

    Posted on 2007-01-31 16:24 Matthew Chen 閱讀(151) 評論(0)  編輯  收藏
    ?

    “泛型Java”,一個美麗的hype

    今天,Sun發布了J2SE 1.5新特性的一個原型實現版本。這個運行在J2SE 1.4上的插件提供了J2SE 1.5主要的幾項新特性,例如類型安全的枚舉、自動裝箱/拆箱、增強的for循環等,當然還有最受關注的JSR-14,泛型。

    在試用了這些新特性之后,我終于對Java的泛型徹底失望了。首先,我們來看看泛型Java的經典用法:

    import java.util.*;

    ?

    public class UseGeneric

    {

    ??? public static void main(String[] args)

    ??? {

    ??? ??? Vector<Integer> vi = new Vector<Integer>();

    ??? ??? vi.add(new Integer(24));

    ??? ??? vi.add(35);

    ?

    ??? ??? for(Integer i : vi)

    ?????? {

    ?????? ??? System.out.println(i);

    ?????? }

    ??? }

    }

    上面的代碼展示了泛型容器、自動裝箱和增強for循環三項新特性。的確,從簡化代碼的角度來說,這些新特性有一定的幫助——當然,自動裝箱其實不應該算一項很有意義的特性,只是因為Java固有的兩套類型體制將intchar等原生類型與對象區分對待,所以在引入泛型容器時不得不采用自動裝箱作為補救。

    將上面的代碼編譯后的class進行反編譯,得到下列代碼:

    import java.io.PrintStream;

    import java.util.Vector;

    ?

    public class UseGeneric

    {

    ?

    ??? public UseGeneric()

    ??? {

    ??? }

    ?

    ??? public static void main(String args[])

    ??? {

    ??? ????Vector vector = new Vector();

    ??????? vector.add(new Integer(24));

    ??????? vector.add(Integer.valueOf(35));

    ??????? Integer integer;

    ??????? for(SimpleIterator simpleiterator = vector.iterator(); simpleiterator.hasNext(); System.out.println(integer))

    ??????????? integer = (Integer)simpleiterator.next();

    ?

    ??? }

    }

    可以看到,所有的新特性都是在現有虛擬機的基礎上實現的,沒有任何新鮮感可言。的確如Joshua Bloch所說的,只不過是把以前由程序員寫的一些代碼轉成由編譯器來寫。

    隨后我試圖實現一些略微高級的泛型技術,例如type traits。我寫了下列代碼:

    // General Traits

    class NumTraits<T>

    {

    ??? public void doSomething()

    ??? {

    ??? ??? System.out.println("General Traits");

    ??? }

    }

    ?

    // Specialized Traits

    class NumTraits<Integer)

    {

    ??? public void doSomething()

    ??? {

    ??? ??? System.out.println("Traits for Integer");

    ??? }

    }

    可惜,這段代碼不能通過編譯,編譯器提示“duplicate class”。顯然,編譯器并沒有把類型參數作為類名稱的一部分,因此traits是不可能實現的了。當然,在成員方法中可以編寫類似于模板特化(specialization)甚至偏特化(partial-specialization)的代碼,但是下面的代碼將證明這種東西毫無意義。

    public class Happy<T>

    {

    ??? private T subject = new T();

    ?

    ??? public <T> void happy()

    ??? {

    ??? ??? subject.beHappy();

    ??? }

    ?

    ??? public static void main(String[] args)

    ??? {

    ??? ??? Happy<Dog> o1 = new Happy<Dog>();

    ??? ??? o1.happy();

    ?

    ??? ??? Happy<Cat> o2 = new Happy<Cat>();

    ??? ??? o2.happy();

    ??? }

    }

    這里的編譯錯誤有兩種。首先,“private T subject = new T();”這個語句不能編譯,也許是我還沒有找到實例化類型參數的正確方法吧。更重要的是,編譯器提示“在java.lang.Object中找不到happy()方法”。由于Java采用“擦拭法”實現泛型,所有類型參數(除非顯式聲明超類或接口)都將被擦拭為Object,因此方法調用的契約仍然完全依賴對象系統來保證。換句話說,類似于模板特化之類的技巧不但在效率上毫無幫助,而且根本無法像C++那樣依賴編譯器進行比較高級的檢查甚至編譯期計算。TypelistSelect模板?還是不要想了吧。

    喏,這就是所謂的“泛型Java”。沒有編譯期動態綁定,沒有type-traits,沒有(真正的)模板特化,一切的問題依然扔給RTTI來完成。我更愿意把它叫做“Java with some type-safe containers”,而不是“Generic Java”。

    泛型Java,一個美麗的hype——如果你對它有太多期望的話。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 插B内射18免费视频| 亚洲女子高潮不断爆白浆| 华人在线精品免费观看| 亚洲自偷自偷在线制服| 国产日韩精品无码区免费专区国产| 亚洲成A人片77777国产| 羞羞漫画页面免费入口欢迎你 | 一级做a爰性色毛片免费| www.亚洲色图| 一级免费黄色大片| 久久亚洲AV无码西西人体| 男女拍拍拍免费视频网站| 亚洲精品无码久久千人斩| 特级做A爰片毛片免费看无码 | 中文字幕亚洲精品无码| 国产精品免费观看久久| 亚洲伊人久久大香线蕉AV| 免费观看毛片视频| 久久亚洲中文字幕无码| 免费成人av电影| 国产精品福利在线观看免费不卡| 亚洲综合区小说区激情区| 99久久99这里只有免费的精品| 亚洲国产精品无码久久久秋霞2 | 3344在线看片免费| 久久亚洲精品AB无码播放| 99视频有精品视频免费观看| 亚洲码在线中文在线观看| 成年网站免费视频A在线双飞| 亚洲人成色4444在线观看| 国产一级淫片视频免费看| 一个人免费播放在线视频看片| 国产成人精品日本亚洲| 99re在线精品视频免费| 99999久久久久久亚洲| 日韩一区二区在线免费观看 | 嫩草在线视频www免费观看| 久久久亚洲欧洲日产国码aⅴ| 黄瓜视频影院在线观看免费| 亚洲国产欧美一区二区三区| 亚洲国产成人爱av在线播放|