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

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

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

    lotusswan

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

    Java 5.0引入泛型以后,提高了類型安全性,然而也給編程帶來了新的挑戰(zhàn)以及新的誤區(qū),類型轉(zhuǎn)換就是一個(gè)很好的例子。引入泛型以后,對象的類型似乎由兩個(gè)類型構(gòu)成:集合類型和參數(shù)類型,例如List<Integer> list = new LinkedList<Integer>(),似乎list的類型由List和Integer共同決定。如果真是這樣,那么我們?nèi)绻M麑ist進(jìn)行類型轉(zhuǎn)換,我們該怎么辦?是對List轉(zhuǎn)換,還是對Integer轉(zhuǎn)換?要解答上面的問題很簡單,編寫如下的代碼,運(yùn)行之就可看出端倪:

    public ? static ? void ?wrongConversion()? {
    ????????List
    < Integer > ?list? = ? new ?LinkedList < Integer >
    ();
    ????????list.add(
    1
    );
    ????????list.add(
    2
    );
    ????????list.add(
    3
    );
    ????????
    ????????
    //
    下面的代碼無法編譯通過。
    ????????
    // List<Number>?wrongList?=?list;

    ????????
    ????}

    ????
    ????
    public ? static ? void ?rightConversion()? {
    ????????LinkedList
    < Integer > ?list? = ? new ?LinkedList < Integer >
    ();
    ????????list.add(
    10
    );
    ????????list.add(
    20
    );
    ????????list.add(
    30
    );
    ????????
    ????????List
    < Integer > ?rightList? =
    ?list;
    ????????
    for ( int ?number:?rightList)?
    {
    ????????????System.out.println(number);
    ????????}

    ????????
    ????}

    如果你運(yùn)行上面的代碼,你會(huì)發(fā)現(xiàn)前一個(gè)函數(shù)根本無法通過編譯,而后一個(gè)函數(shù)不僅編譯成功,而且能得到正確結(jié)果。這似乎給出了一個(gè)結(jié)論:對象的類型由集合類型來決定,對對象進(jìn)行類型轉(zhuǎn)換時(shí)也是對集合類型進(jìn)行轉(zhuǎn)換。事實(shí)確實(shí)如此!那么為什么會(huì)如此呢?
    我們可以回憶一下以前我們對參數(shù)類型的描述:參數(shù)類型不過是一個(gè)占位符而已,在編譯時(shí),它會(huì)被具體的類型代替,同時(shí)對添加到集合對象中的數(shù)據(jù)進(jìn)行參數(shù)檢查;如果添加到對象中的數(shù)據(jù)類型不是指定的具體類型或其子類型,則編譯出錯(cuò);而且,編譯以后,該占位符會(huì)被移除,運(yùn)行時(shí)你是無法得到任何集合類型中數(shù)據(jù)的類型信息的。簡而言之:
    ???????? List<String> strings = new LinkedList<String>( );
    ???????? List<Integer> ints = new LinkedList<Integer>( );
    上面的代碼在運(yùn)行時(shí)和
    ???????? List strings = new LinkedList( );
    ???????? List ints = new LinkedList( );
    毫無二致。了解了這一點(diǎn)以后,相信我們對于類型轉(zhuǎn)換也會(huì)有更深的理解了。
    泛型給我們帶來了好處,使我們在編譯時(shí)就能發(fā)現(xiàn)很多錯(cuò)誤;然而任何事物都是柄雙刃劍,泛型也不例外。泛型的缺點(diǎn)最明顯之處就在于類型轉(zhuǎn)換。如果你讀過前面的文章,肯定看到過不帶參數(shù)類型的集合對象轉(zhuǎn)換為帶參數(shù)類型的集合對象,其實(shí)不僅僅如此,這兩者之間可以任意轉(zhuǎn)換。這就意味著一點(diǎn),我們不僅可以對集合類型進(jìn)行轉(zhuǎn)換,也可以對參數(shù)類型進(jìn)行任意的轉(zhuǎn)換。這似乎與前面的描述不符,因?yàn)樯厦娴拇a中的List<Number> wrongList = list;根本無法編譯通過。確實(shí)如此,這行代碼確實(shí)無法編譯通過,不過我們中間做一步處理以后,上面的轉(zhuǎn)換就可以正常編譯了:
    ??????? List mediaList = list;
    ????????List<Number> wrongList = mediaList;
    由此可見,泛型在給我們帶來好處的同時(shí),也帶來了無數(shù)陷阱,我們在編程時(shí)需十分注意,而Java的泛型機(jī)制也需要不斷更新。
    最后和以往一樣,以一個(gè)拙劣的程序結(jié)束本文:
    package ?com.jiang.tiger.chap1;

    import
    ?java.util.ArrayList;
    import
    ?java.util.LinkedList;
    import
    ?java.util.List;

    public ? class ?GenericReflection?
    {
    ????
    private ? static ?List < Integer > ?ints? = ? new ?ArrayList < Integer >
    (?);
    ????
    ????
    public ? static ? void ?fillList(List < Integer > ?list)?
    {
    ????????
    for ?(Integer?i?:?list)?
    {
    ??????????ints.add(i);
    ????????}

    ????}

    ????
    ????
    public ? static ? void ?printList(?)? {
    ????????
    for ?(Integer?i?:?ints)?
    {
    ????????????System.out.println(i);
    ????????}

    ????}

    ????
    ????
    public ? static ? void ?badConversion()? {
    ????????List
    < Integer > ?list? = ? new ?LinkedList < Integer >
    ();
    ????????list.add(
    1
    );
    ????????list.add(
    2
    );
    ????????list.add(
    3
    );
    ????????fillList(list);
    ????????printList();
    ????????List?badList?
    =
    ?list;
    ????????badList.add(
    " bad?number "
    );
    ????????badList.add(
    " wrong?idea "
    );
    ????????fillList(list);
    ????????printList();
    ????????
    ????}

    ????
    ????
    public ? static ? void ?badConversion2()? {
    ????????List?list?
    = ? new
    ?LinkedList();
    ????????list.add(
    1
    );
    ????????list.add(
    2
    );
    ????????list.add(
    " bad?number "
    );
    ????????
    ????????List
    < Integer > ?badList? =
    ?list;
    ????????badList.add(
    12
    );
    ????????
    for ?(Integer?i?:?badList)?
    {
    ????????????System.out.println(i);
    ????????}

    ????}

    ????
    ????
    public ? static ? void ?wrongConversion()? {
    ????????List
    < Integer > ?list? = ? new ?LinkedList < Integer >
    ();
    ????????list.add(
    100
    );
    ????????list.add(
    200
    );
    ????????list.add(
    300
    );
    ????????
    ????????
    //
    下面的代碼無法編譯通過。
    ????????
    // List<Number>?wrongList?=?list;

    ????????List?mediaList? = ?list;
    ????????List
    < Number > ?wrongList? =
    ?mediaList;
    ????????wrongList.add(
    120.23
    );
    ????????wrongList.add(
    0.1230
    );
    ????????
    for (Integer?inter?:?list)?
    {
    ????????????System.out.println(inter);
    ????????}

    ????????
    ????}

    ????
    ????
    public ? static ? void ?rightConversion()? {
    ????????LinkedList
    < Integer > ?list? = ? new ?LinkedList < Integer >
    ();
    ????????list.add(
    10
    );
    ????????list.add(
    20
    );
    ????????list.add(
    30
    );
    ????????
    ????????List
    < Integer > ?rightList? =
    ?list;
    ????????
    for (Integer?number:?rightList)?
    {
    ????????????System.out.println(number);
    ????????}

    ????????
    ????}

    ????
    ????
    public ? static ? void ?badReflection()? {
    ????????List
    < Integer > ?myInts? = ? new ?ArrayList < Integer >
    (?);
    ????????
    ????????myInts.add(
    4
    );
    ????????myInts.add(
    5
    );
    ????????myInts.add(
    6
    );????
    ????????
    ????????System.out.println(
    " Filling?list?and?printing?in?normal?way "
    );
    ????????fillList(myInts);
    ????????printList(?);
    ????????
    ????????
    try ?
    {
    ????????????List?list?
    = ?(List)GenericReflection. class .getDeclaredField( " ints " ).get( null
    );
    ????????????list.add(
    " Illegal?Value! "
    );
    ????????}
    ? catch ?(Exception?e)? {
    ????????????e.printStackTrace(?);
    ????????}

    ????????System.out.println(
    " Printing?with?illegal?values?in?list " );
    ????????printList(?);
    ????}

    ????
    ????
    public ? static ? void ?main(String[]?args)? {
    ????????
    ????????System.out.println(
    " rightConversion "
    );
    ????????rightConversion();
    ????????
    try
    {
    ????????????Thread.sleep(
    1000
    );
    ????????????System.out.println(
    " badConversion "
    );
    ????????????badConversion();
    ????????}
    ? catch (Exception?ce)? {
    ????????????ce.printStackTrace();
    ????????}

    ????????
    try {
    ????????????Thread.sleep(
    1000
    );
    ????????????System.out.println(
    " badConversion2 "
    );
    ????????????badConversion2();
    ????????}
    ? catch (Exception?ce)? {
    ????????????ce.printStackTrace();
    ????????}

    ????????
    try {
    ????????????Thread.sleep(
    1000
    );
    ????????????System.out.println(
    " wrongConversion "
    );
    ????????????wrongConversion();
    ????????}
    ? catch (Exception?ce)? {
    ????????????ce.printStackTrace();
    ????????}

    ????????
    try {
    ????????????Thread.sleep(
    1000
    );
    ????????????System.out.println(
    " badReflection "
    );
    ????????????badReflection();
    ????????}
    ? catch (Exception?ce)? {
    ????????????ce.printStackTrace();
    ????????}

    ????????
    ????}

    }
    上面程序的輸出結(jié)果為:
    rightConversion
    10
    20
    30
    badConversion
    1
    2
    3
    java.lang.ClassCastException:?java.lang.String
    ????at?com.jiang.tiger.chap1.GenericReflection.fillList(GenericReflection.java:11)
    ????at?com.jiang.tiger.chap1.GenericReflection.badConversion(GenericReflection.java:32)
    ????at?com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:109)
    badConversion2
    1
    2
    java.lang.ClassCastException:?java.lang.String
    ????at?com.jiang.tiger.chap1.GenericReflection.badConversion2(GenericReflection.java:45)
    ????at?com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:116)
    wrongConversion
    100
    200
    300
    java.lang.ClassCastException:?java.lang.Double
    ????at?com.jiang.tiger.chap1.GenericReflection.wrongConversion(GenericReflection.java:62)
    ????at?com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:123)
    badReflection
    Filling?list?and?printing?in?normal?way
    1
    2
    3
    1
    2
    3
    4
    5
    6
    java.lang.ClassCastException:?java.lang.String
    ????at?com.jiang.tiger.chap1.GenericReflection.printList(GenericReflection.java:17)
    ????at?com.jiang.tiger.chap1.GenericReflection.badReflection(GenericReflection.java:99)Printing?with?illegal?values?in?list
    1
    2
    3
    1
    2
    3
    4
    5
    6

    ????at?com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:130)
    posted on 2006-12-06 22:53 lotusswan 閱讀(3123) 評(píng)論(0)  編輯  收藏 所屬分類: Tiger學(xué)習(xí)筆記
    主站蜘蛛池模板: 性生交片免费无码看人| 国产特黄一级一片免费| 亚洲一级毛片免费观看| 久久精品九九亚洲精品| 4444亚洲国产成人精品| 亚洲国产精品免费在线观看| 亚洲视频日韩视频| 亚洲另类小说图片| 久久精品国产亚洲AV久| 在线观看亚洲AV日韩AV| 亚洲AV无码AV吞精久久| 免费亚洲视频在线观看| 一级毛片正片免费视频手机看| 一级毛片a免费播放王色电影 | 9420免费高清在线视频| 亚洲免费观看网站| 国产成在线观看免费视频| 女人被弄到高潮的免费视频| 国产成人精品免费直播| 狠狠色婷婷狠狠狠亚洲综合| 亚洲国产综合无码一区| 亚洲资源在线视频| 亚洲第一街区偷拍街拍| 九九全国免费视频| 免费视频成人手机在线观看网址| 久久99国产乱子伦精品免费| 欧美最猛性xxxxx免费| 免费一级成人毛片| 亚洲第一AV网站| 亚洲精品一二三区| 日韩精品免费一线在线观看| 成人久久免费网站| A在线观看免费网站大全| 免费国产人做人视频在线观看| 亚洲精品麻豆av| 亚洲最大的成网4438| 亚洲精品无码久久久久秋霞| 一个人看的www免费高清| 99久久免费精品视频| 日本免费福利视频| 亚洲精品国产精品乱码视色|