LinuxÒÁµéÔ°ÂÛ̳'s Archiver

ynwll ·¢±íÓÚ 2004-11-27 16:10

[·­Òë]Java·ºÐͱà³ÌÖ¸ÄÏ

[·­Òë]Java·ºÐͱà³ÌÖ¸ÄÏ

´ËϵÁÐÎÄÕÂÒë×ÔSUNµÄ·ºÐͱà³ÌÖ¸ÄÏ, ¿´²»¶®ÒëÎĵÄÇë¿´Ô­ÎÄ
[url]http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf[/url]

Ò»¡¢Ð÷ÑÔ
    JDK1.5¶ÔJAVAÓïÑÔ½øÐÐÁË×öÁ˼¸¸öÀ©Õ¹£¬ÆäÖÐÒ»¸ö¾ÍÊÇ·ºÐÍ¡£
    ±¾Ö¸ÄÏÖ¼ÔÚ½éÉÜ·ºÐÍ¡£Èç¹ûÄãÊìϤÆäËüÓïÑԵĹ¹ÔìÀàËÆµÄ¶«Î÷£¬ÌرðÊÇC++µÄÄ£
°å£¨template£©£¬Äã»áºÜ¿ì·¢ÏÖËüÃÇÖ®¼äµÄÏàͬµã¼°ÖØÒªµÄ²»Í¬µã£»Èç¹ûÄãÔÚÆäËû
µØ·½Ã»¿´µ½¹ýÀàËÆµÄ¶«Î÷£¬ÄÇ·´¶ø¸üºÃ£¬ÄÇÑùÄã¾Í¿ÉÒÔ¿ªÊ¼È«ÐµÄѧϰ£¬Óò»×ÅÈ¥Íü
µôÄÇЩ£¨¶ÔJAVA·ºÐÍ£©ÈÝÒײúÉúÎó½âµÄ¶«Î÷¡£
    ·ºÐÍÔÊÐíÄã¶ÔÀàÐͽøÐгéÏó¡£×î³£¼ûµÄÀý×ÓÊÇÈÝÆ÷ÀàÐÍ£¬±ÈÈçÄÇЩÔÚCollection
²ã´ÎϵÄÀàÐÍ¡£
    ÏÂÃæÊÇÄÇÀàÀý×ӵĵäÐÍÓ÷¨£º

    List myIntList = new LinkedList();//1
    myIntList.add(new Integer(0));//2
    Integer x = (Integer) myIntList.iterator().next();//3

    µÚ3ÐÐÀïµÄÇ¿ÖÆÀàÐÍת»»Óе㷳ÈË£¬³ÌÐòͨ³£¶¼ÖªµÀÒ»¸öÌØ¶¨µÄÁ´±í£¨list£©Àï
´æ·ÅµÄÊǺÎÖÖÀàÐ͵ÄÊý¾Ý£¬µ«È´Ò»¶¨Òª½øÐÐÀàÐÍת»»¡£±àÒëÆ÷Ö»Äܱ£Ö¤µü´úÆ÷·µ»ØµÄ
ÊÇÒ»¸ö¶ÔÏó£¬Òª±£Ö¤¶ÔIntegerÀàÐͱäÁ¿µÄ¸³ÖµÊÇÀàÐͰ²È«µÄ»°£¬±ØÐë½øÐÐÀàÐÍת»»¡£
    ÀàÐÍת»»²»µ«»áÒýÆð³ÌÐòµÄ»ìÂÒ£¬»¹¿ÉÄܻᵼÖÂÔËÐÐʱ´íÎó£¬ÒòΪ³ÌÐòÔ±¿ÉÄÜ»á
·¸´íÎó¡£
    Èç¹û³ÌÐòÔ±¿ÉÒÔÈçʵµØ±í´ïËûÃǵÄÒâͼ£¬¼´±ê¼ÇÒ»¸öÖ»Äܰüº¬Ìض¨Êý¾ÝÀàÐ͵ÄÁ´
±í£¬ÄÇ»áÔõôÑùÄØ£¿Õâ¾ÍÊÇ·ºÐͱ³ºóµÄºËÐÄ˼Ïë¡£ÏÂÃæÊÇÇ°Ãæ´úÂëµÄ·ºÐÍд·¨£º
    List<Integer> myIntList = new LinkedList<Integer>();//1'
    myIntList.add(new Integer(0));//2'
    Integer x = myIntList.iterator().next();//3'

    Çë×¢Òâ±äÁ¿myIntListµÄÀàÐÍÉùÃ÷£¬ËüÖ¸Ã÷ÁËÕâ²»½ö½öÊÇÒ»¸öÈÎÒâµÄList£¬»¹
ÊÇÒ»¸öIntegerÀàÐ͵ÄList£¬Ð´×÷List<Integer>¡£ÎÒÃÇ˵ListÊÇÒ»¸ö½ÓÊÜÀàÐÍ£¨ÔÚ
Õâ¸öÀý×ÓÊÇInteger£©²ÎÊýµÄ·º»ªµÄ½Ó¿Ú£¬ÔÚ´´½¨Á´±í¶ÔÏóµÄʱºò£¬ÎÒÃÇÒ²Ö¸¶¨ÁËÒ»¸ö
ÀàÐͲÎÊý¡£
    ÁíÍâҪעÒâµÄÊÇÔÚµÚ3'ÐеÄÀàÐÍת»»ÒѾ­²»¼ûÁË¡£
    ÏÖÔÚÄã¿ÉÄÜ»áÏ룬ÎÒÃÇËù×öµÄÈ«²¿¶¼ÊÇΪÁ˰ѻìÂÒÏû³ý¡£ÎÒÃÇûÓÐÔÚµÚ3ÐаÑÀà
ÐÍת»»ÎªInteger£¬¶øÊÇÔÚµÚ1'ÐмÓÁËIntegerÀàÐͲÎÊý£»·ÇÒ²·ÇÒ²£¬ÕâÀïÃæ²î±ðºÜ
´ó£¬±àÒëÆ÷ÏÖÔÚÄܹ»ÔÚ±àÒëÆÚ¼ä¼ì²â³ÌÐòµÄÀàÐÍÕýÈ·ÐÔ¡£µ±ÎÒÃǰÑmyIntListÉùÃ÷Ϊ
ÀàÐÍList<Integer>µÄºó£¬¾ÍÒâζ×űäÁ¿myIntListÔÚºÎʱºÎµØµÄʹÓö¼ÊÇÕýÈ·µÄ£¬
±àÒëÆ÷±£Ö¤ÁËÕâÒ»µã¡£Ïà·´£¬ÀàÐÍת»»Ö»ÊǸæËßÎÒÃdzÌÐòÔ±ÈÏΪËüÔÚ³ÌÐòµÄij¸öµØ·½
ÊÇÕýÈ·µÄ¡£
    ʵ¼ÊµÄ½á¹ûÊÇ£¬³ÌÐò£¨ÌرðÊÇ´óÐ͵ijÌÐò£©µÄ¿É¶ÁÐԺͽ¡×³ÐԵõ½ÁËÌá¸ß¡£

ynwll ·¢±íÓÚ 2004-11-27 16:11

¶þ¡¢¶¨Òå¼òµ¥µÄ·ºÐÍ

ÏÂÃæÊÇjava.util°üÀïµÄListºÍIterator½Ó¿Ú¶¨ÒåµÄÒ»¸öССµÄÒýÓãº

    public interface List<E>{
      void add(E x);
      Iterator<E> iterator();
    }
    public interface Iterator<E>{
      E next();
      boolean hasNext();
    }

    ³ýÁ˼âÀ¨ºÅÀïµÄ¶«Î÷£¬ÕâÀïËùÓеͼӦ¸ÃºÜÊìϤÁË¡£ÄÇÊÇListºÍIterator½Ó¿Ú
µÄ¹æ·¶ÀàÐͲÎÊýµÄÉùÃ÷¡£
    ÀàÐͲÎÊý¿ÉÒÔÓÃÔÚÈκεķºÐÍÉùÃ÷ÖУ¬¾ÍÏñʹÓÃÆÕͨµÄÀàÐÍÒ»Ñù£¨ËäÈ»ÓÐһЩºÜ
ÖØÒªµÄÏÞÖÆ£»¿´µÚ7²¿·Ö£©¡£
    ÔÚÐ÷ÑÔÖУ¬ÎÒÃÇ¿´µ½ÁËList·ºÐÍÉùÃ÷µÄµ÷Ó㬱ÈÈçList<Integer>¡£ÔÚµ÷ÓÃÀïÃæ
£¨Í¨³£³ÆÎª²ÎÊý»¯ÀàÐÍ£©£¬ËùÓгöÏֹ淶ÀàÐͲÎÊý£¨ÕâÀïÊÇE£©µÄÈ«²¿¶¼ÓÃʵ¼ÊµÄÀàÐÍ
²ÎÊý£¨ÕâÀïÊÇInteger£©Ëù´úÌæ¡£
    Äã¿ÉÒÔÏëÏó³ÉList<Integer>´ú±íËùÓÐE¶¼ÓÃInteger´úÌæÁ˵ÄList£º

    public interface IntegerList{
      void add(Integer x)
      Iterator<Integer> iterator();
    }

    ÕâÖÖÏë·¨ÊÇÓÐËù°ïÖúµÄ£¬µ«Ò²»áÔì³ÉÎó½â¡£
    ËüÊÇÓÐËù°ïÖúµÄ£¬ÊÇÒòΪ²ÎÊý»¯ÀàÐÍList<integer>Óп´ÆðÀ´ÏñÕâÖÖÀ©Õ¹µÄ·½·¨¡£
    Ëü»áÔì³ÉÎó½â£¬ÊÇÒòΪ·ºÐ͵ÄÉùÃ÷ʵ¼ÊÉϲ»»áÏñÄÇÑùÈ¥À©Õ¹£»ÔÚÔ´´úÂëÖС¢¶þ½øÖÆ
ÎļþÖС¢Ó²Å̺ÍÄÚÔÚÀ¶¼Ã»ÓдúÂëµÄ¶à¸ö¿½±´¡£Èç¹ûÄãÊÇÒ»¸öC++³ÌÐòÔ±£¬Äã»áÃ÷°×
Õâ¸úC++µÄÄ£°å£¨template£©ºÜ²»Í¬¡£
    ·ºÐÍÉùÃ÷ÊÇÒ»´Î±àÒ룬ÓÀԶʹÓã¬Ëü»á±ä³ÉÒ»¸öµ¥¶ÀµÄclassÎļþ£¬¾ÍÏñÒ»¸öÆÕͨ
µÄÀà»ò½Ó¿ÚÉùÃ÷¡£
    ÀàÐͲÎÊý¸úÓÃÔÚ·½·¨»ò¹¹Ô캯ÊýÀïµÄÆÕͨµÄ²ÎÊýÀàËÆ£¬¾ÍÏñÒ»¸ö·½·¨¾ßÓÐÃèÊöËüÔË
ËãÓõ½µÄÖµµÄÀàÐ͵Ĺ淶ֵ²ÎÒ»Ñù£¬·º»¯ÉùÃ÷¾ßÓй淶ÀàÐͲÎÊý¡£µ±Ò»¸ö·½·¨±»µ÷ÓõÄ
ʱºò£¬Êµ¼ÊµÄ²ÎÊý½«»á±»¹æ·¶²ÎÊýËù´úÌæ¶ø¶Ô·½·¨ÇóÖµ¡£µ±Ò»¸ö·º»¯ÉùÃ÷±»µ÷ÓõÄʱºò£¬
ʵ¼ÊÀàÐͲÎÊý½«»á´úÌæ¹æ·¶ÀàÐͲÎÊý¡£
    ÃüÃû¹ßÀýҪעÒâµÄÒ»¸öµØ·½¡£ÎÒÃǽ¨ÒéÄãÓÃһЩ¼òÁ¶£¨Èç¹û¿ÉÒԵϰֻÓÃÒ»¸ö×Ö
·û£©µ«È´Ó³ÑÛµÄÃû×Ö×÷Ϊ¹æ·¶ÀàÐͲÎÊýÃû¡£ÔÚÄÇЩÃû×ÖÖÐ×îºó±ÜÃâСд×Öĸ£¬ÕâÑù¿É
ÒÔºÜÈÝÒװѹ淶ÀàÐͲÎÊýºÍÆÕͨµÄÀà»ò½Ó¿ÚÇø·Ö¿ªÀ´¡£¾ÍÏñÇ°ÃæµÄÀý×ÓÒ»Ñù£¬ºÜ¶àÈÝ
Æ÷ÀàÐÍʹÓÃE¡£ÎÒÃǽ«»áÔÚºóÃæµÄÀý×ÓÀï¿´µ½ÆäËûµÄ¹ßÀý¡£

ynwll ·¢±íÓÚ 2004-11-27 16:12

Èý¡¢·ºÐͺÍ×ÓÀ໯

[url]http://xoj.blogone.net[/url]

    ÎÒÃÇÀ´²âÊÔһ϶ԷºÐ͵ÄÀí½â£¬ÏÂÃæµÄ´úÂëÊÇ·ñÕýÈ·ÄØ£¿

    List<String> ls = new ArrayList<String>();//1
    List<Object> lo = ls;//2

    µÚ1Ðп϶¨ÊÇÕýÈ·µÄ£¬ÎÊÌâµÄÄѵãÔÚÓÚµÚ2ÐУ»ÕâÑù¾Í¹é½áΪÕâ¸öÎÊÌ⣺һ¸ö×Ö·û
´®£¨String£©Á´±í£¨List£©ÊDz»ÊÇÒ»¸ö¶ÔÏóÁ´±í£¿´ó²¿·ÖÈ˵ÄÖ±¾õÊÇ£º¡°¿Ï¶¨ÁË£¡¡±
    ÄǺ㬿´Ò»ÏÂÏÂÃæÕâÁ½ÐУº

    lo.add(new Object());//3
    String s = ls.get(0);//4:Æóͼ°ÑÒ»¸ö¶ÔÏó¸³Öµ¸ø×Ö·û´®£¡

    ÔÚÕâÀïÎÒÃǰÑlsºÍlo¸ã»ìÏýÁË¡£ÎÒÃÇͨ¹ý±ðÃûloÀ´·ÃÎÊ×Ö·û´®Á´±íls£¬²åÈë²»
È·¶¨¶ÔÏó£»½á¹û¾ÍÊÇls²»ÔÙ´æ´¢×Ö·û´®£¬µ±ÎÒÃdz¢ÊÔ´ÓÀïÃæÈ¡³öÊý¾ÝµÄʱºò¾Í»á³ö´í¡£
    Java±àÒëÆ÷µ±È»²»ÔÊÐíÕâÑùµÄÊÂÇé·¢ÉúÁË£¬ËùÒÔµÚ2Ðп϶¨»á±àÒë³ö´í¡£
    Ò»°ãÀ´Ëµ£¬Èç¹ûFooÊÇBarµÄ×ÓÀàÐÍ£¨×ÓÀà»ò×Ó½Ó¿Ú£©£¬¶øGÓÖÊÇij¸ö·ºÐÍÉùÃ÷µÄ
»°£¬G<Foo>²¢²»ÊÇG<Bar>µÄ×ÓÀàÐÍ¡£Õâ¿ÉÄÜÊÇѧϰ·ºÐ͵Äʱºò×îÄѵĵط½£¬ÒòΪËü
ÓëÎÒÃǵÄÉî²ãÖ±¾õÏàÎ¥±³¡£
    Ö±¾õ³ö´íµÄÎÊÌâÔÚÓÚËü°Ñ¼¯ºÏÀïµÄ¶«Î÷¼ÙÏëΪ²»»á¸Ä±äµÄ£¬ÎÒÃǵı¾ÄܰÑÕâЩ¶«
Î÷¿´×÷ÊDz»±äµÄ¡£
    ¾Ù¸öÀý×Ó£¬¼ÙÉèÆû³µ¹«Ë¾ÎªÈ˿ڵ÷²é¾ÖÌṩһ·Ý¼ÝʻԱµÄÁÐ±í£¬Õâ¿´ÉÏȥͦºÏÀí¡£
¼ÙÉèDriverÊÇPersonµÄÒ»¸ö×ÓÀ࣬ÔòÎÒÃÇÈÏΪList<Driver>ÊÇÒ»¸öList<Person>¡£
¶øÊµ¼ÊÉÏÌá½»µÄÊÇÒ»·Ý¼ÝʻԱµÇ¼Ç±íµÄÒ»¸ö¸±±¾¡£·ñÔòµÄ»°£¬È˿ڵ÷²é¾Ö½«¿ÉÒÔ¼ÝʻԱ
µÄÈ˼ÓÈëµ½ÄÇ·ÝÁбíÖÐÈ¥£¬Æû³µ¹«Ë¾µÄ¼Í¼Êܵ½ÆÆ»µ¡£
    ΪÁ˽â¾öÕâÀàÎÊÌ⣬ÎÒÃÇÐèÒª¿¼ÂÇһЩ¸üÁé»îµÄ·ºÐÍ£¬µ½ÏÖÔÚΪֹÅöµ½µÄ¹æÔòÌ«
ÊÜÔ¼ÊøÁË¡£

ynwll ·¢±íÓÚ 2004-11-27 16:14

ËÄ¡¢Í¨Åä·û

[url]http://xoj.blogone.net[/url]

    ¿¼ÂÇÒ»ÏÂдһ¸ö³ÌÐòÀ´´òÓ¡Ò»¸ö¼¯ºÏ¶ÔÏó£¨collection£©ÀïµÄËùÓÐÔªËØ¡£
    ÔھɰæµÄÓïÑÔÀïÃæ£¬Äã¿ÉÒÔ»áÏñÏÂÃæÄÇÑùд£º

    void printCollection(Collection c){
      Iterator i = c.iterator();
      for (k = 0; k < c.size(); k++){
        System.out.println(i.next());
      }
    }
   
    ÏÂÃæ³¢ÊÔ×ÅÓ÷ºÐÍ£¨ºÍеÄforÑ­»·Óï·¨£©À´Ð´£º

    void printCollection(Collection<Object> c){
      for (Object e : c) {
        System.out.println(e);
      }
    }

    ÕâÑùµÄÎÊÌâÊÇа汾µÄ´úÂ뻹û¾É°æ±¾µÄ´úÂëºÃÓ᣾ÍÏñÎÒÃǸÕʾ·¶µÄÒ»Ñù£¬
Collection<Object>²¢²»ÊÇËùÓÐÀàÐ͵ļ¯ºÏµÄ¸¸ÀàÐÍ£¬ËùÒÔËüÖ»ÄܽÓÊÜCollection<Object>
¶ÔÏ󣬶ø¾É°æµÄ´úÂëÈ´¿ÉÒÔ°ÑÈκÎÀàÐ͵ļ¯ºÏ¶ÔÏó×÷Ϊ²ÎÊýÀ´µ÷Óá£
    ÄÇô£¬Ê²Ã´²ÅÊÇËùÓм¯ºÏÀàÐ͵ĸ¸ÀàÐÍÄØ£¿Õâ¸ö¶«Î÷д×÷Collection<?>£¨¶Á
×÷¡°Î´Öª¼¯ºÏ¡±£©£¬¾ÍÊÇÔªËØÀàÐÍ¿ÉÒÔΪÈκÎÀàÐ͵ļ¯ºÏ¡£Õâ¾ÍÊÇËüΪʲô±»³ÆÎª¡°Í¨
Åä·ûÀàÐÍ¡±µÄÔ­Òò¡£ÎÒÃÇ¿ÉÒÔÕâÑùд£º
   
    void printCollection(Collection<?> c){
      for (Object e : c) {
        System.out.println(e);
      }
    }

    ÏÖÔÚ£¬ÎÒÃǾͿÉÒÔÒÔÈκÎÀàÐ͵ļ¯ºÏ¶ÔÏó×÷Ϊ²ÎÊýÀ´µ÷ÓÃÁË¡£×¢Ò⣬ÔÚprintCollection()
·½·¨ÀïÃæ£¬ÎÒÃÇÈÔÈ»¿ÉÒÔ´Óc¶ÔÏóÖжÁÈ¡ÔªËØ²¢¸³ÓèObjectÀàÐÍ£»ÒòΪÎÞÂÛ¼¯ºÏÀï
ʵ¼Ê°üº¬ÁËʲôÀàÐÍ£¬Ëü¿Ï¶¨ÊǶÔÏó£¬ËùÒÔÊÇÀàÐͰ²È«µÄ¡£µ«¶ÔËü²åÈëÈÎÒâµÄ¶ÔÏó
µÄ»°ÔòÊDz»°²È«µÄ£º
   
    Collection<?> c = new ArrayList<String>();
    c.add(new Object());//±àÒë´íÎó

    ÓÉÓÚÎÒÃDz¢²»ÖªµÀcµÄÔªËØÀàÐÍÊÇʲô£¬Òò´ËÎÒÃDz»ÄÜ¶ÔÆä²åÈë¶ÔÏó¡£add()·½·¨
½ÓÊÜÀàÐÍE£¬¼´¼¯ºÏµÄÔªËØÀàÐ͵IJÎÊý¡£µ±Êµ¼ÊµÄÀàÐͲÎÊýÊÇ?µÄʱºò£¬¾Í´ú±íÊÇijδ
ÖªÀàÐÍ¡£Èκδ«µÝ¸øadd·½·¨µÄ²ÎÊý£¬ÆäÀàÐͱØÐëÊǸÃδ֪ÀàÐ͵Ä×ÓÀàÐÍ¡£ÒòΪÎÒÃDz¢
²»ÖªµÀÄÇÊÇʲôÀàÐÍ£¬ËùÒÔÎÒÃÇ´«µÝ²»ÁËÈκβÎÊý¡£Î¨Ò»µÄÀýÍâ¾ÍÊÇnull£¬ÒòΪËüÊÇÈÎ
ºÎ£¨¶ÔÏó£©ÀàÐ͵ijÉÔ±¡£
    ÁíÍ⣬¼ÙÉèÓÐÒ»¸öList<?>£¬ÎÒÃÇ¿ÉÒÔµ÷ÓÃget()·½·¨²¢Ê¹ÓÃÆä·µ»Ø½á¹û¡£½á¹û
ÀàÐÍÊÇÒ»¸öδ֪ÀàÐÍ£¬µ«ÎÒÃǶ¼ÖªµÀËüÊÇÒ»¸ö¶ÔÏó¡£Òò´Ë°Ñget()·½·¨µÄ·µ»Ø½á¹û¸³
Öµ¸ø¶ÔÏóÀàÐÍ£¬»òÕß°ÑËü×÷Ϊһ¸ö¶ÔÏó²ÎÊý´«µÝ¶¼ÊÇÀàÐͰ²È«µÄ¡£

ynwll ·¢±íÓÚ 2004-11-27 16:20

ËÄ¡¢1-ÓнçͨÅä·û

[url]http://xoj.blogone.net[/url]

¿¼ÂÇÒ»¸ö¼òµ¥µÄ»­Í¼³ÌÐò£¬Ëü¿ÉÒÔ»­³¤·½ÐκÍÔ²µÈÐÎ×´¡£ÎªÁ˱íʾÕâЩÐÎ×´£¬
Äã¿ÉÄܻᶨÒåÕâÑùµÄÒ»¸öÀà²ã´Î½á¹¹£º

    public abstract class Shape{
      public abstract void draw(Canvas c);
    }
    public class Circle extends Shape{
      private int x, y, radius;
      public void draw(Canvas c) { ... }
    public class Rectangle extends Shape {
      private int x, y, width, height;
      public void draw(Canvas c) { ... }
    }
   
    ÕâЩÀà¿ÉÒÔÔÚcanvasÉÏÃè»­£º

    public class Canvas {
      public void draw(Shape s) {
        s.draw(this);
      }
    }

    ÈκεÄÃ軭ͨ³£¶¼°üÀ¨Óм¸ÖÖÐÎ×´£¬¼ÙÉèËüÃÇÓÃÒ»¸öÁ´±íÀ´±íʾ£¬ÄÇôÈç¹ûÔÚ
CanvasÀïÃæÓÐÒ»¸ö·½·¨À´»­³öËùÓеÄÐÎ×´µÄ»°£¬Äǽ«»áºÜ·½±ã£º
   
    public void drawAll(List<Shape> shapes) {
      for (Shape s: shapes) {
        s.draw(this);
      }
    }

    µ«ÊÇÏÖÔÚ£¬ÀàÐ͵ĹæÔò˵drawAll()·½·¨Ö»ÄܶÔÈ·ÇеÄShapeÀàÐÍÁ´±íµ÷Óã¬
±ÈÈ磬Ëü²»ÄܶÔList<Circle>ÀàÐ͵÷Óø÷½·¨¡£ÄÇÕæÊDz»ÐÒ£¬ÒòΪÕâ¸ö·½·¨ËùÒª
×öµÄ¾ÍÊÇ´ÓÁ´±íÖжÁÈ¡ÐÎ×´¶ÔÏ󣬴Ӷø¶ÔList<Circle>ÀàÐͶÔÏó½øÐе÷Óá£ÎÒÃÇ
ÕæÕýËùÏëµÄÊÇÒªÈÃÕâ¸ö·½·¨Äܹ»½ÓÊÜÒ»¸öÈκÎÐÎ×´µÄÀàÐÍÁ´±í£º

    public void drawAll(List<? extends Shape> shapes) { ... }

    ÕâÀïÓÐÒ»¸öºÜСµ«ºÜÖØÒªµÄ²»Í¬µã£ºÎÒÃǰÑÀàÐÍList<Shape>Ìæ»»ÎªList<? extends Shape>¡£
ÏÖÔÚdrawAll()·½·¨¿ÉÒÔ½ÓÊÜÈκÎShape×ÓÀàµÄÁ´±í£¬ÎÒÃǾͿÉÒÔÈçÔ¸µÄ¶ÔList<Circle>
µ÷ÓýøÐÐÀ²¡£
    List<? extends Shape>ÊÇÒ»¸öÓнçͨÅä·ûµÄÀý×Ó¡£? ±íʾһ¸öδ֪ÀàÐÍ£¬
¾ÍÏñÎÒÃÇ֮ǰËù¿´µ½µÄͨÅä·ûÒ»Ñù¡£µ«ÊÇ£¬ÎÒÃÇÖªµÀÔÚÕâ¸öÀý×ÓÀïÃæÕâ¸öδ֪ÀàÐÍ
ʵ¼ÊÊÇShapeµÄ×ÓÀàÐÍ£¨×¢£ºËü¿ÉÒÔÊÇShape±¾Éí£¬»òÕßÊÇËüµÄ×ÓÀ࣬ÎÞÐëÔÚ×ÖÃæÉÏ
±íÃ÷ËüÊǼ̳ÐShapeÀàµÄ£©¡£ÎÒÃÇ˵ShapeÊÇͨÅä·ûµÄ¡°ÉϽ硱¡£
    ÈçÍù³£Ò»Ñù£¬Ê¹ÓÃͨÅä·û´øÀ´µÄÁé»îÐÔµÃÒª¸¶³öÒ»¶¨µÄ´ú¼Û£»´úÂë¾ÍÊÇÏÖÔÚÔÚ
·½·¨ÀïÃæ²»ÄܶÔShape¶ÔÏó²åÈëÔªËØ¡£ÀýÈ磬ÏÂÃæµÄд·¨ÊDz»ÔÊÐíµÄ£º

    public void addRectangle(List<? extends Shape> shapes) {
      shapes.add(0, new Rectangle()); //±àÒë´íÎó
    }

    ÄãÓ¦¸Ã¿ÉÒÔÖ¸³öΪʲôÉÏÃæµÄ´úÂëÊDz»ÔÊÐíµÄ¡£shapes.add()·½·¨µÄµÚ¶þ¸ö
²ÎÊýµÄÀàÐÍÊÇ ? ¼Ì³ÐShape£¬Ò²¾ÍÊÇÒ»¸öδ֪µÄShapeµÄ×ÓÀàÐÍ¡£¼ÈÈ»ÎÒÃDz»ÖªµÀ
ÀàÐÍÊÇʲô£¬ÄÇôÎÒÃǾͲ»ÖªµÀËüÊÇ·ñÊÇRectangleµÄ¸¸ÀàÐÍÁË£»Ëü¿ÉÄÜÊÇÒ²¿ÉÄÜ
²»ÊÇÒ»¸ö¸¸ÀàÐÍ£¬Òò´ËÔÚÄÇÀï´«µÝÒ»¸öRectangleµÄ¶ÔÏóÊDz»°²È«µÄ¡£
    ÓнçͨÅä·ûÕýÊÇÐèÒªÓÃÀ´´¦ÀíÆû³µ¹«Ë¾¸øÈ˿ڵ÷²é¾ÖÌá½»Êý¾ÝµÄÀý×Ó·½·¨¡£ÔÚ
ÎÒÃǵÄÀý×ÓÀïÃæ£¬ÎÒÃǼÙÉèÊý¾Ý±íʾΪÐÕÃû£¨ÓÃ×Ö·û´®±íʾ£©¶ÔÈË£¨±íʾΪÒýÓÃÀà
ÐÍ£¬±ÈÈçPerson»òËüµÄ×ÓÀàÐÍDriverµÈ£©µÄÓ³Éä¡£Map<K, V>ÊÇÓÐÁ½¸öÀàÐͲÎÊýµÄ
Ò»¸ö·ºÐ͵ÄÀý×Ó£¬±íʾ¼üÖµÓ³Éä¡£
    ÇëÔÙÒ»´Î×¢Òâ¹æ·¶ÀàÐͲÎÊýµÄÃüÃû¹ßÀý£ºK±íʾ¼ü£¬V±íʾֵ¡£

    public class Census {
      public static void
        addRegistry(Map<String, ? extends Person> registry){ ... }
      }
    ...
    Map<String, Driver> allDrivers = ...;
    Census.addRegistry(allDrivers);

ynwll ·¢±íÓÚ 2004-11-27 16:21

Îå¡¢·ºÐÍ·½·¨

[url]http://xoj.blogone.net[/url]
   
¿¼ÂÇдÕâÑùÒ»¸ö·½·¨£¬Ëü½ÓÊÕÒ»¸öÊý×éºÍÒ»¸ö¼¯ºÏ£¨collection£©×÷Ϊ²ÎÊý£¬
²¢°ÑÊý×éÀïµÄËùÓжÔÏó·Åµ½¼¯ºÏÀïÃæ¡£
    ÏÈÊÔÊÔÕâÑù£º

    static void fromArrayToCollection(Object[] a, Collection<?> c){
      for (Object o : a){
        c.add(o);//±àÒë´íÎó
      }
    }

    µ½ÏÖÔÚ£¬ÄãÓ¦¸Ãѧ»áÁ˱ÜÃâ°ÑCollection<Object>×÷Ϊ¼¯ºÏ²ÎÊýµÄÀàÐÍÕâÖÖ³õѧ
ÕߵĴíÎó£»Äã¿ÉÄÜ»ò¿ÉÄÜû¿´³öʹÓÃCollection<?>Ò²ÊDz»Ðе쬻ØÏëһϣ¬ÄãÊDz»ÄÜ
°Ñ¶ÔÏóÓ²Èû½øÒ»¸öδ֪ÀàÐ͵ļ¯ºÏÀïÃæµÄ¡£
    ½â¾öÕâÀàÎÊÌâµÄ·½·¨ÊÇʹÓ÷ºÐÍ·½·¨¡£¾ÍÏñÀàÐÍÉùÃ÷Ò»Ñù£¬·½·¨Ò²¿ÉÒÔÉùÃ÷Ϊ·ºÐÍ
µÄ£¬¾ÍÊÇ˵£¬ÓÃÒ»¸ö»ò¶à¸öÀàÐͲÎÊý×÷Ϊ²ÎÊý¡£

    static <T> void fromArrayToCollection(T[]a, Collection<T> c){
      for (T o : a){
        c.add(o);//ÕýÈ·
      }
    }

    ¶ÔÓÚ¼¯ºÏÔªËØµÄÀàÐÍÊÇÊý×éÀàÐ͵ĸ¸ÀàÐÍ£¬ÎÒÃǾͿÉÒÔµ÷ÓÃÕâ¸ö·½·¨¡£

    Object[] oa = new Object[100];
    Collection<Object> co = new ArrayList<Object>();
    fromArrayToCollection(oa, co);// TÊǶÔÏóÀàÐÍ
    String[] sa = new String[100];
    Collection<String> cs = new ArrayList<String>();
    fromArrayToCollection(sa, cs);// TÊÇ×Ö·û´®ÀàÐÍ£¨String£©
    fromArrayToCollection(sa, co);// T¶ÔÏóÀàÐÍ
    Integer[] ia = new Integer[100];
    Float[] fa = new Float[100];
    Number[] na = new Number[100];
    Collection<Number> cn = new ArrayList<Number>();
    fromArrayToCollection(ia, cn);// TÊÇNumberÀàÐÍ
    fromArrayToCollection(fa, cn);// TÊÇNumberÀàÐÍ
    fromArrayToCollection(na, cn);// TÊÇNumberÀàÐÍ
    fromArrayToCollection(na, co);// TÊÇNumberÀàÐÍ
    fromArrayToCollection(na, cs);// ±àÒë´íÎó

    Çë×¢Ò⣬ÎÒÃDz¢Ã»ÓаÑʵ¼ÊµÄÀàÐÍʵ²Î´«µÝ¸ø·ºÐÍ·½·¨£¬ÒòΪ±àÒëÆ÷»á¸ù¾Ý
ʵ²ÎµÄÀàÐÍΪÎÒÃÇÍÆ¶Ï³öÀàÐÍʵ²Î¡£Ò»°ãµØ£¬±àÒëÆ÷ÍÆ¶ÏµÃµ½¿ÉÒÔÕýÈ·µ÷ÓõÄ×î
½Ó½üµÄ£¨the most specific£©Êµ²ÎÀàÐÍ¡£
    ÏÖÔÚÓÐÒ»¸öÎÊÌ⣺ÎÒÓ¦¸ÃʲôʱºòʹÓ÷ºÐÍ·½·¨£¬Ê²Ã´Ê±ºòʹÓÃͨÅä·ûÀàÐÍ
ÄØ£¿ÎªÁËÃ÷°×Õâ¸öÎÊÌâµÄ´ð°¸£¬ÎÒÃÇÀ´¿´¿´Collection¿âÀïµÄ¼¸¸ö·½·¨£º
   
    interface Collection<E>{
      public boolean containsAll(Collection<?> c);
      public boolean addAll(Collection<? extends E> c);
    }

    ÔÚÕâÀïÎÒÃÇÒ²¿ÉÒÔÓ÷ºÐÍ·½·¨£º

    interface Collection<E>{
      public <T> boolean containsAll(Collection<T> c);
      public <? extends E>boolean addAll(Collection<T> c);
      //¹þ¹þ£¬ÀàÐͱäÁ¿Ò²¿ÉÒÔÓн磡
    }

        µ«ÊÇ£¬ÀàÐͲÎÊýTÔÚcontainsAllºÍaddAllÁ½¸ö·½·¨ÀïÃæ¶¼Ö»ÊÇÓÃÁËÒ»´Î¡£·µ
»ØÀàÐͲ¢²»ÒÀÀµÓÚÀàÐͲÎÊý»òÆäËû´«µÝ¸ø¸Ã·½·¨µÄʵ²Î£¨ÕâÖÖÊÇÖ»ÓÐÒ»¸öʵ²ÎµÄ¼òµ¥
Çé¿ö£©¡£Õâ¾Í¸æËßÎÒÃÇÀàÐÍʵ²ÎÊÇÓÃÓÚ¶à̬µÄ£¬ËüµÄ×÷ÓÃÖ»ÊǶԲ»Í¬µÄµ÷ÓÿÉÒÔÓÐÒ»
ϵÁеÄʵ¼ÊµÄʵ²ÎÀàÐÍ¡£Èç¹ûÊÇÄÇÑùµÄ»°£¬¾ÍÓ¦¸ÃʹÓÃͨÅä·û£¬Í¨Åä·û¾ÍÊÇÉè¼ÆÀ´Ö§
³ÖÁé»îµÄ×ÓÀàÐ͵ģ¬ÕâÒ²ÊÇÎÒÃÇÕâÀïËùÒª±íÊöµÄ¶«Î÷¡£
    ·ºÐÍ·½·¨ÔÊÐíÀàÐͲÎÊýÓÃÓÚ±íÊöÒ»¸ö»ò¶à¸öµÄʵ²ÎÀàÐͶԷ½·¨»ò¼°Æä·µ»ØÀàÐ͵Ä
ÒÀÀµ¹ØÏµ¡£Èç¹ûûÓÐÄÇÑùµÄÒ»¸öÒÀÀµ¹ØÏµµÄ»°£¬·ºÐÍ·½·¨¾Í²»Ó¦ÓÃʹÓá£
    Ò²ÓпÉÄÜÊÇһǰһºóÒ»ÆðʹÓ÷ºÐÍ·½·¨ºÍͨÅä·ûµÄÇé¿ö£¬ÏÂÃæÊÇCollections.copy()
·½·¨£º
   
    class Collections {
      public static <T> void copy(List<T> dest, list< ? extends T> src) {...}
    }

    Çë×¢ÒâÕâÀïÁ½¸ö²ÎÊýÀàÐ͵ÄÒÀÀµ¹ØÏµ£¬ÈκÎÒª´ÓÔ´Á´±ísrc¸´ÖƹýÀ´µÄ¶ÔÏó¶¼±Ø
ÐëÊǶÔÄ¿±êÁ´±ídstÔªËØ¿É¸³ÖµµÄ£»ËùÒÔÎÒÃÇ¿ÉÒÔ²»¹ÜsrcµÄÔªËØÀàÐÍÊÇʲô£¬Ö»Òª
ËüÊÇTÀàÐ͵Ä×ÓÀàÐÍ¡£copy·½·¨µÄ·½·¨Í·±íʾÁËʹÓÃÒ»¸öÀàÐͲÎÊý£¬µ«ÊÇÓÃͨÅä·ûÀ´
×÷ΪµÚ¶þ¸ö²ÎÊýµÄÔªËØÀàÐ͵ÄÒÀÀµ¹ØÏµ¡£
    ÎÒÃÇÊÇ¿ÉÒÔÓÃÁíÍâÒ»ÖÖ²»ÓÃͨÅä·ûÀ´Ð´Õâ¸ö·½·¨Í·µÄ°ì·¨¡£

    class Collections {
      public static <T, S extends T>
          vod copy(List<T> dest, List<S> src) { ...}
    }

    ûÎÊÌ⣬µ«Êǵ±µÚÒ»¸öÀàÐͲÎÊýÓÃ×÷dstµÄÀàÐͺÍÅú¶þ¸öÀàÐͲÎÊýSµÄÉϽçµÄ
ʱºò£¬SËü±¾ÉíÔÚsrcÀàÐÍÀïÖ»ÄÜʹÓÃÒ»´Î£¬Ã»ÓÐÆäËûµÄ¶«Î÷ÒÀÀµÓÚËü¡£Õâ¾ÍÒâζ
×ÅÎÒÃÇ¿ÉÒÔÓÃÒ»¸öͨÅä·ûÀ´´úÌæSÁË¡£Ê¹ÓÃͨÅä·û±ÈÉùÃ÷ÏÔʽµÄÀàÐͲÎÊýÒªÀ´µÃÇå
ÎúºÍ¼òµ¥£¬Òò´ËÔÚ¿ÉÄܵϰ¶¼ÓÅÏÈʹÓÃͨÅä·û¡£
    µ±Í¨Åä·ûÓÃÓÚ·½·¨Í·Íⲿ£¬×÷Ϊ³ÉÔ±±äÁ¿¡¢¾Ö²¿±äÁ¿ºÍÊý×éµÄÀàÐ͵Äʱºò£¬Í¬
ÑùÒ²ÓÐÓÅÊÆ¡£Çë¿´ÏÂÃæµÄÀý×Ó¡£
    ¿´»ØÎÒÃÇ֮ǰ»­Í¼µÄÄǸöÎÊÌ⣬ÏÖÔÚÎÒÃÇÏëÒª±£ÁôÒ»·Ý»­Í¼ÇëÇóµÄÀúÊ·¼Ç¼¡£
ÎÒÃÇ¿ÉÒÔÕâÑùÀ´Î¬»¤Õâ·ÝÀúÊ·¼Ç¼£¬ÔÚShapeÀàÀïÓÃÒ»¸ö¾²Ì¬µÄ±äÁ¿±íʾÀúÊ·¼Ç¼£¬
È»ºóÔÚdrawAll()·½·¨ÀïÃæ°Ñ´«µÝµÄʵ²Î´¢´æµ½ÄÇÀúÊ·¼Ç¼±äÁ¿ÀïÍ·¡£
   
    static List<List<? extends Shape>> history =
      new ArrayList<List<? extends Shape>>();
    public void drawAll(List<? extends Shape> shapes){
      history.addLast(shapes);
      for (Shape s: shapes) {
        s.draw(this);
      }
    }

    ×îºó£¬ÎÒÃÇÔÙ´ÎÁôÒâÒ»ÏÂʹÓÃÀàÐͲÎÊýµÄÃüÃû¹ßÀý¡£µ±Ã»Óиü¾«È·µÄÀàÐÍÀ´
Çø·ÖµÄʱºò£¬ÎÒÃÇÓÃTÀ´±íʾÀàÐÍ£¬ÕâÊÇͨ³£ÊÇÔÚ·ºÐÍ·½·¨ÀïÃæµÄÇé¿ö¡£Èç¹ûÓжà
¸öÀàÐͲÎÊý£¬ÎÒÃÇ¿ÉÒÔÓÃÔÚ×Öĸ±íÖÐÓëTÏàÁÚµÄ×ÖĸÀ´±íʾ£¬±ÈÈçS¡£Èç¹ûÒ»¸ö·º
ÐÍ·½·¨³öÏÖÔÚÒ»¸ö·ºÐÍÀàÀïÃæ£¬Ò»¸öºÃµÄ·½·¨¾ÍÊÇ£¬Ó¦¸Ã±ÜÃâ¶Ô·½·¨ºÍÀàʹÓÃÏà
ͬµÄÀàÐͲÎÊýÒÔÃâ·¢Éú»ìÏý¡£ÕâÔÚǶÌ×·ºÐÍÀàÀïÒ²Ò»Ñù¡£

ynwll ·¢±íÓÚ 2004-11-27 16:21

Áù¡¢ÓëÒÅÁô´úÂëµÄ½»»¥


        µ½ÏÖÔÚΪֹ£¬ÎÒÃÇËùÓеÄÀý×Ó¶¼ÊÇÔÚÒ»¸ö¼ÙÏëµÄÀíÏëÊÀ½çÀïÃæµÄ£¬¾ÍÊÇËùÓеÄ
È˶¼ÔÚʹÓÃJavaÓïÑÔÖ§³Ö·ºÐ͵Ä×îа汾¡£
    °¦£¬²»¹ýÔÚÏÖʵÖÐÇé¿öÈ´²»ÊÇÄÇÑù¡£Ç§°ÙÍòÐеĴúÂë¶¼ÊÇÓÃÔçÆÚ°æ±¾µÄÓïÑÔ
À´±àдµÄ£¬²»¿ÉÄܰÑËüÃÇÈ«²¿ÔÚÒ»Ò¹Ö®¼ä¾Íת»»¹ýÀ´¡£
    ÔÚºóÃæµÄµÚ10²¿·Ö£¬ÎÒÃǽ«»á½â¾ö°ÑÒÅÁô´úÂëתΪÓ÷ºÐÍÕâ¸öÎÊÌâ¡£ÔÚÕⲿ·Ö
ÎÒÃÇÒª¿´µÄÊDZȽϼòµ¥µÄÎÊÌ⣺ÒÅÁô´úÂëÓë·ºÐÍ´úÂëÈçºÎ½»»¥£¿Õâ¸öÎÊÌâ·ÖΪÁ½¸ö
²¿·Ö£ºÔÚ·ºÐÍ´úÂëÖÐʹÓÃÒÅÁô´úÂëºÍÔÚÒÅÁô´úÂëÖÐʹÓ÷ºÐÍ´úÂë¡£

ynwll ·¢±íÓÚ 2004-11-27 16:22

Áù-1 ÔÚ·ºÐÍ´úÂëÖÐʹÓÃÒÅÁô´úÂë

[url=http://xoj.blogone.net][url]
    µ±ÄãÔÚÏíÊÜÔÚ´úÂëÖÐʹÓ÷ºÐÍ´øÀ´µÄºÃ´¦µÄʱºò£¬ÄãÔõôÑùʹÓÃÒÅÁô´úÂëÄØ£¿
    ¼ÙÉèÕâÑùÒ»¸öÀý×Ó£¬ÄãҪʹÓÃcom.Foodlibar.widgetsÕâ¸ö°ü¡£Fooblibar.com
µÄÈËÒªÏúÊÛÒ»¸ö¿â´æ¿ØÖÆÏµÍ³£¬Ö÷Òª²¿·ÖÈçÏ£º
   
    package com.Fooblibar.widgets;
    public interface Part { ... }
    public class Inventory {
    /**
     *Adds a new Assembly to the inventory databse.
     *The assembly is given the name name, and consists of a set
     *parts specified by parts. All elements of the collection parts
     *must support the Part interface.
    **/
      public static void addAssembly(String name, Collection parts) {...}
      public static Assembly getAssembly(String name) {...}
    }
    public interface Assembly{
      Collection getParts();//Returns a collection of Parts
    }

    ÏÖÔÚ£¬Äã¿ÉÒÔÓÃÉÏÃæµÄAPIÀ´Ôö¼ÓеĴúÂ룬Ëü¿ÉÒԺܺõı£Ö¤Äãµ÷ÓòÎÊýÇ¡µ±
µÄaddAssembly()·½·¨£¬¾ÍÊÇ˵´«µÝµÄ¼¯ºÏÊÇÒ»¸öPartÀàÐ͵ÄCollection¶ÔÏ󣬵±
È»£¬·ºÐÍÊÇ×îÊʺÏ×öÕâ¸ö£º

    package com.mycompany.inventory;
    import com.Fooblibar.widgets.*;
    public class Blade implements Part{
    ...
    }
    public class Guillotine implements Part {
    }
    public class Main {
      public static void main(Sring[] args) {
        Collection<Part> c = new ArrayList<Part>();
        c.add(new Guillotine());
        c.add(new Blade());
        Inventory.addAssembly("thingee", c);
        Collection<Part> k = Inventory.getAssembly("thingee").getParts();
      }
    }

    µ±ÎÒÃǵ÷ÓÃaddAssembly·½·¨µÄʱºò£¬ËüÏëÒªµÄµÚ¶þ¸ö²ÎÊýÊÇCollectionÀàÐ͵ģ¬
ʵ²ÎÊÇCollection<Part>ÀàÐÍ£¬µ«È´¿ÉÒÔ£¬ÎªÊ²Ã´ÄØ£¿±Ï¾¹£¬´ó¶àÊý¼¯ºÏ´æ´¢µÄ¶¼²»ÊÇ
Part¶ÔÏó£¬ËùÒÔ×ܵÄÀ´Ëµ£¬±àÒëÆ÷²»»áÖªµÀCollection´æ´¢µÄÊÇʲôÀàÐ͵ļ¯ºÏ¡£
    ÔÚÕý¹æµÄ·ºÐÍ´úÂëÀïÃæ£¬Collection¶¼´øÓÐÀàÐͲÎÊý¡£µ±Ò»¸öÏñCollectionÕâÑù
µÄ·ºÐͲ»´øÀàÐͲÎÊýʹÓõÄʱºò£¬³ÆÖ®ÎªÔ­ÉúÀàÐÍ¡£
    ºÜ¶àÈ˵ĵÚÒ»Ö±¾õÊÇCollection¾ÍÊÇÖ¸Collection<Object>£¬µ«´ÓÎÒÃÇÏÈǰËù
¿´µ½µÄ¿ÉÒÔÖªµÀ£¬µ±ÐèÒªµÄ¶ÔÏóÊÇCollection<Object>£¬¶ø´«µÝµÄÈ´ÊÇCollection<Part>
¶ÔÏóµÄʱºò£¬ÊÇÀàÐͲ»°²È«µÄ¡£È·ÇеãµÄ˵·¨ÊÇCollectionÀàÐͱíʾһ¸öδ֪ÀàÐ͵Ä
¼¯ºÏ£¬¾ÍÏñCollection<?>¡£
    ÉÔµÈһϣ¬ÄÇÑù×öÒ²ÊDz»ÕýÈ·µÄ£¡¿¼ÂÇһϵ÷ÓÃgetParts()·½·¨£¬Ëü·µ»ØÒ»¸ö
Collection¶ÔÏó£¬È»ºó¸³Öµ¸øk£¬¶økÊÇCollection<Part>ÀàÐ͵ģ»Èç¹ûµ÷ÓõĽá¹û
ÊÇ·µ»ØÒ»¸öCollection<?>µÄ¶ÔÏó£¬Õâ¸ö¸³Öµ¿ÉÄÜÊÇ´íÎóµÄ¡£
    ÊÂʵÉÏ£¬Õâ¸ö¸³ÖµÊÇÔÊÐíµÄ£¬Ö»ÊÇËü»á²úÉúÒ»¸öδ¼ì²â¾¯¸æ¡£¾¯¸æÊÇÐèÒªµÄ£¬ÒòΪ
±àÒëÆ÷²»Äܱ£Ö¤¸³ÖµµÄÕýÈ·ÐÔ¡£ÎÒÃÇûÓа취ͨ¹ý¼ì²âÒÅÁô´úÂëÖеÄgetAssembly()·½·¨
À´±£Ö¤·µ»ØµÄ¼¯ºÏµÄÈ·ÊÇÒ»¸öÀàÐͲÎÊýÊÇPartµÄ¼¯ºÏ¡£³ÌÐòÀïÃæµÄÀàÐÍÊÇCollection£¬
ÎÒÃÇ¿ÉÒԺϷ¨µÄ¶Ô´Ë¼¯ºÏ²åÈëÈκζÔÏó¡£
    ËùÒÔ£¬Õâ²»Ó¦¸ÃÊÇ´íÎóµÄÂð£¿ÀíÂÛÉÏÀ´Ëµ£¬´ð°¸ÊÇ£ºÊÇ£»µ«Êµ¼ÊÉÏÈç¹ûÊÇ·ºÐÍ´úÂë
µ÷ÓÃÒÅÁô´úÂëµÄ»°£¬ÕâÓÖÊÇÔÊÐíµÄ¡£¶ÔÕâ¸ö¸³ÖµÊÇ·ñ¿É½ÓÊÜ£¬µÃÈ¡¾öÓÚ³ÌÐòÔ±×Ô¼º£¬ÔÚ
Õâ¸öÀý×ÓÖи³ÖµÊǰ²È«µÄ£¬ÒòΪgetAssembly()·½·¨Ô¼¶¨ÊÇ·µ»ØÒÔPart×÷ΪÀàÐͲÎÊýµÄ
¼¯ºÏ£¬¾¡¹ÜÔÚÀàÐͱê¼ÇÖÐûÓбíÃ÷¡£
    ËùÒÔÔ­ÉúÀàÐͺÜÏñͨÅä·ûÀàÐÍ£¬µ«ËüÃÇûÓÐÄÇôÑϸñµÄÀàÐͼì²â¡£ÕâÊÇÓÐÒâÉè¼Æ³É
ÕâÑùµÄ£¬´Ó¶ø¿ÉÒÔÔÊÐí·ºÐÍ´úÂë¿ÉÒÔÓë֮ǰÒÑÓеÄÒÅÁô´úÂë½»»¥¡£
    ÔÚ·ºÐÍ´úÂëÖе÷ÓÃÒÅÁô´úÂë¹ÌÈ»ÊÇΣÏյģ¬Ò»µ©°Ñ·ºÐÍ´úÂëºÍ·Ç·ºÐÍ´úÂë»ìºÏÔÚÒ»
Æð£¬·ºÐÍϵͳËùÌṩµÄÈ«²¿°²È«±£Ö¤¾Í¶¼±äµÃÎÞЧÁË¡£µ«ÕâÈԱȸù±¾²»Ê¹Ó÷ºÐÍÒªºÃ£¬
×îÆðÂëÄãÖªµÀÄãµÄ´úÂëÊÇÒ»Öµġ£
    ·ºÐÍ´úÂë³öÏֵĽñÌ죬ÈÔÈ»Óкܶà·Ç·ºÐÍ´úÂ룬¶þÕß»ìºÏͬʱʹÓÃÊDz»¿É±ÜÃâµÄ¡£
    Èç¹ûÒ»¶¨Òª°ÑÒÅÁô´úÂëÓë·ºÐÍ´úÂë»ìºÏʹÓã¬ÇëСÐÄÁôÒâÄÇЩδ¼ì²â¾¯¸æ¡£×ÐϸµÄ
ÏëÏëÈçºÎ²ÅÄÜÅж¨Òý·¢¾¯¸æµÄ´úÂëÊǰ²È«µÄ¡£
    Èç¹ûÈÔÈ»³ö´í£¬´úÂëÒý·¢µÄ¾¯¸æÊµ¼Ê²»ÊÇÀàÐͰ²È«µÄ£¬ÄÇÓÖÔõôÑùÄØ£¿ÎÒÃǻῴ
ÄÇÑùµÄÇé¿ö£¬½ÓÏÂÀ´£¬ÎÒÃǽ«»á²¿·ÖµÄ¹Û²ì±àÒëÆ÷µÄ¹¤×÷·½Ê½¡£

ynwll ·¢±íÓÚ 2004-11-27 16:22

Áù-2 ²Á³ýºÍ·­Òë


    public String loophole(Integer x){
      List<String> ys = new LinkedList<String>();
      List xs = ys;
      xs.add(x);//±àÒëʱδ¼ì²â¾¯¸æ
      return ys.iterator().next();
    }

    ÔÚÕâÀïÎÒÃǶ¨ÒåÁËÒ»¸ö×Ö·û´®ÀàÐ͵ÄÁ´±íºÍÒ»¸öÒ»°ãµÄÀÏʽÁ´±í£¬ÎÒÃÇÏȲåÈë
Ò»¸öInteger¶ÔÏó£¬È»ºóÊÔͼȡ³öÒ»¸öString¶ÔÏ󣬺ÜÃ÷ÏÔÕâÊÇ´íÎóµÄ¡£Èç¹ûÎÒÃÇ
ºöÂÔ¾¯¸æ¼ÌÐøÖ´ÐдúÂëµÄ»°£¬³ÌÐò½«»áÔÚÎÒÃÇʹÓôíÎóÀàÐ͵ĵط½³ö´í¡£ÔÚÔËÐÐʱ£¬
´úÂëÖ´ÐдóÖÂÈçÏ£º

    public String loophole(Integer x) {
      List ys = new LinkedList;
      List xs = ys;
      xs.add(x);
      return (String)ys.iterator().next();//ÔËÐÐʱ³ö´í
    }

    µ±ÎÒÃÇÒª´ÓÁ´±íÖÐÈ¡³öÒ»¸öÔªËØ£¬²¢°ÑËüµ±×÷ÊÇÒ»¸ö×Ö·û´®¶ÔÏó¶ø°ÑËüת»»Îª
StringÀàÐ͵Äʱºò£¬ÎÒÃǽ«»áµÃµ½Ò»¸öClassCastExceptionÀàÐÍת»»Òì³£¡£ÔÚ
·ºÐͰ汾µÄloophole()·½·¨ÀïÃæ·¢ÉúµÄ¾ÍÊÇÕâÖÖÇé¿ö¡£
    ³öÏÖÕâÖÖÇé¿öµÄÔ­ÒòÊÇ£¬JavaµÄ·ºÐÍÊÇͨ¹ýÒ»¸öǰ̨ת»»¡°²Á³ý¡±µÄ±àÒëÆ÷ʵÏÖ
µÄ£¬Äã»ù±¾ÉÏ¿ÉÒÔÈÏΪËüÊÇÒ»¸öÔ´Âë¶ÔÔ´ÂëµÄ·­Ò룬Õâ¾ÍÊÇΪºÎ·ºÐͰæµÄloophole()
·½·¨×ª±äΪ·Ç·ºÐͰ汾µÄÔ­Òò¡£
    ½á¹ûÊÇ£¬JavaÐéÄâ»úµÄÀàÐͰ²È«ÐÔºÍÍêÕûÐÔÓÀÔ¶²»»áÓÐÎÊÌ⣬¾ÍËã³öÏÖδ¼ì²â
µÄ¾¯¸æ¡£
    »ù±¾ÉÏ£¬²Á³ý»á³ýÈ¥ËùÓеķºÐÍÐÅÏ¢¡£¼âÀ¨ºÅÀïÃæµÄËùÓÐÀàÐÍÐÅÏ¢¶¼»áÈ¥µô£¬±È
È磬²ÎÊý»¯ÀàÐ͵ÄList<String>»áת»»ÎªList¡£ÀàÐͱäÁ¿ÔÚÖ®ºóʹÓÃʱ»á±»ÀàÐÍ
±äÁ¿µÄÉϽ磨ͨ³£ÊÇObject£©ËùÌæ»»¡£µ±×îºó´úÂë²»ÊÇÀàÐÍÕýÈ·µÄʱºò£¬¾Í»á¼ÓÈë
Ò»¸öÊʵ±µÄÀàÐÍת»»£¬¾ÍÏñloophole()·½·¨µÄ×îºóÒ»ÐС£
    ¶Ô¡°²Á³ý¡±µÄÍêÕûÃèÊö²»ÊDZ¾Ö¸Äϵķ¶Î§ÄÚµÄÄÚÈÝ£¬µ«Ç°ÃæÎÒÃÇËù¸øµÄ¼òµ¥ÃèÊö
Ò²²î²»¶àÊÇÄÇÑùÁË¡£Á˽âÕâµãºÜÓкô¦£¬ÌرðÊǵ±ÄãÏë×öÖîÈç°ÑÏÖÓÐAPIתΪʹÓÃ
·ºÐÍ£¨Çë¿´µÚ10²¿·Ö£©ÕâÑù¸´ÔӵĶ«Î÷£¬»òÕßÊÇÏëÖªµÀΪʲôËüÃÇ»áÄÇÑùµÄʱºò¡£

ynwll ·¢±íÓÚ 2004-11-27 16:22

Áù-3 ÔÚÒÅÁô´úÂëÖÐʹÓ÷ºÐÍ



    ÏÖÔÚÎÒÃÇÀ´¿´¿´Ïà·´µÄÇé¿ö¡£¼ÙÉèFooblibar.com°ÑËûÃǵÄAPIת»»Îª·ºÐ͵ģ¬
µ«ÓÐЩ¿Í»§»¹Ã»ÓÐת»»¡£´úÂë¾Í»áÏñÏÂÃæµÄ£º

    package com.Fooblibar.widgets;
    public interface Part { ... }
    publlic class Inventory {
    /**
     *Adds a new Assembly to the inventory database.
     *The assembly is given the name name, and consists of a set
     *parts specified by parts. All elements of the collection parts
     *must support the Part interface.
    **/
      public static void addAssembly(String name, Collection<Part> parts) {...}
      public static Assembly getAssembly(String name){ ... }
    }
    public interface Assembly {
      Collection<Part> getParts();//Return a collection of Parts
    }

    ¿Í»§´úÂëÈçÏ£º

    package com.mycompany.inventory;
    import com.Fooblibar.widgets.*;
    public class Blade implements Part {
    ...
    }
    public class Guillotine implements Part {
    ...
    }
    public class Main {
      public static void main(String[] args){
        Collection c = new ArrayList();
        c.add(new Guillotine());
        c.add(new Blade());
        Inventory.addAssembly("thingee", c);//1: unchecked warning
        Collection k = Inventory.getAssembly("thingee").getParts();
      }
    }

    ¿Í»§´úÂëÊÇÔÚÒý½ø·ºÐÍ֮ǰдÏµģ¬µ«ÊÇËüʹÓÃÁËcom.Fooblibar.widgets°üºÍ¼¯
ºÏ¿â£¬Á½¸öÏÖÔÚ¶¼ÊÇÔÚÓ÷ºÐ͵ġ£ÔÚ¿Í»§´úÂëÀïÃæÊ¹ÓõķºÐÍÈ«²¿¶¼ÊÇÔ­ÉúÀàÐÍ¡£
    µÚ1ÐвúÉúÒ»¸öδ¼ì²â¾¯¸æ£¬ÒòΪ°ÑÒ»¸öÔ­ÉúCollection´«µÝ¸øÁËÒ»¸öÐèÒªPartÀàÐ͵Ä
CollectionµÄµØ·½£¬±àÒëÆ÷²»Äܱ£Ö¤Ô­ÉúµÄCollectionÊÇÒ»¸öPartÀàÐ͵ÄCollection¡£
    ²»ÕâÑù×öµÄ»°£¬ÄãÒ²¿ÉÒÔÔÚ±àÒë¿Í»§´úÂëµÄʱºòʹÓÃsource 1.4Õâ¸ö±ê¼ÇÀ´±£Ö¤²»
»á²úÉú¾¯¸æ¡£µ«ÊÇÕâÑùµÄ»°Äã¾Í²»ÄÜʹÓÃËùÓÐJDK 1.5ÒýÈëµÄеÄÓïÑÔÌØÐÔ¡£

ynwll ·¢±íÓÚ 2004-11-27 16:23

Æß¡¢»ÞɬÄѶ®µÄ²¿·Ö

Æß-1 ·ºÐÍÀàΪËùÓе÷ÓÃËù¹²Ïí
    ÏÂÃæµÄ´úÂë¶Î»á´òÓ¡³öÊ²Ã´ÄØ£¿

    List<String> l1 = new ArrayList<String>();
    List<Integer> l2 = new ArrayList<Integer>();
    System.out.println(l1.getClass() == l2.getClass());

    Äã¿ÉÄÜ»á˵ÊÇfalse£¬µ«ÊÇÄã´íÁË£¬´òÓ¡µÄÊÇtrue£¬ÒòΪËùÓзºÐÍÀàµÄʵÀýËüÃÇ
µÄÔËÐÐʱµÄÀࣨrun-time class£©¶¼ÊÇÒ»ÑùµÄ£¬²»¹ÜËüÃÇʵ¼ÊÀàÐͲÎÊýÈçºÎ¡£
    ·ºÐÍÀàÖ®ËùÒÔΪ·ºÐ͵ģ¬ÊÇÒòΪËü¶ÔËùÓпÉÄܵÄÀàÐͲÎÊý¶¼ÓÐÏàͬµÄÐÐΪ£¬Ïàͬ
µÄÀà¿ÉÒÔ¿´×÷ÊÇÓкܶ಻ͬµÄÀàÐÍ¡£
    ½á¹û¾ÍÊÇ£¬Ò»¸öÀàµÄ¾²Ì¬µÄ±äÁ¿ºÍ·½·¨Ò²¹²ÏíÓÚËùÓеÄʵÀýÖУ¬Õâ¾ÍÊÇΪʲô²»
ÔÊÐíÔÚ¾²Ì¬·½·¨»ò³õʼ»¯²¿·Ö¡¢»òÕßÔÚ¾²Ì¬±äÁ¿µÄÉùÃ÷»ò³õʼ»¯ÖÐÒýÓÃÀàÐͲÎÊý¡£

ynwll ·¢±íÓÚ 2004-11-27 16:23

Æß-2 Ç¿ÖÆÀàÐÍת»»ºÍinstanceof

·ºÐÍÀàÔÚËüËùÓеÄʵÀýÖй²Ïí£¬¾ÍÒâζ×ÅÅжÏÒ»¸öʵÀýÊÇ·ñÊÇÒ»¸öÌØ±ðµ÷Óõķº
Ð͵ÄʵÀýÊǺÁÎÞÒâÒåµÄ£º

    Collection cs = new ArrayList<String>();
    if (cs instanceof Collection<String>) {...}//·Ç·¨

    ÀàËÆµØ£¬ÏñÕâÑùµÄÇ¿ÖÆÀàÐÍת»»£º

    Collection<String> cstr = (Collection<String>) cs;//δ¼ì²â¾¯¸æ

    ¸ø³öÁËÒ»¸öδ¼ì²âµÄ¾¯¸æ£¬ÒòΪÕâÀïϵͳÔÚÔËÐÐʱ²¢²»»á¼ì²â¡£
    ¶ÔÓÚÀàÐͱäÁ¿Ò²Ò»Ñù£º

    <T> T BadCast(T t, Object o) {
      return (T) o;//δ¼ì²â¾¯¸æ
    }

    ÀàÐͱäÁ¿²»´æÔÚÓÚÔËÐÐʱ£¬Õâ¾ÍÊÇ˵ËüÃǶÔʱ¼ä»ò¿Õ¼äµÄÐÔÄܲ»»áÔì³ÉÓ°Ïì¡£
µ«Ò²Òò´Ë¶ø²»ÄÜͨ¹ýÇ¿ÖÆÀàÐÍת»»¿É¿¿µØÊ¹ÓÃËüÃÇÁË¡£

ynwll ·¢±íÓÚ 2004-11-27 16:23

Æß-3 Êý×é

Êý×é¶ÔÏóµÄ×é¼þÀàÐÍ¿ÉÄܲ»ÊÇÒ»¸öÀàÐͱäÁ¿»òÒ»¸ö²ÎÊý»¯ÀàÐÍ£¬³ý·ÇËüÊÇÒ»¸ö
£¨ÎÞ½çµÄ£©Í¨Åä·ûÀàÐÍ¡£Äã¿ÉÒÔÉùÃ÷ÔªËØÀàÐÍÊÇÀàÐͱäÁ¿ºÍ²ÎÊý»ªÀàÐ͵ÄÊý×éÀàÐÍ£¬
µ«ÔªËØÀàÐͲ»ÄÜÊÇÊý×é¶ÔÏó¡£
    Õâ×ÔÈ»ÓеãÓôÃÆ£¬µ«Õâ¸öÏÞÖÆ¶Ô±ÜÃâÏÂÃæµÄÇé¿öÊDZØÒªµÄ£º

    List<Strign>[] lsa = new List<String>[10];//ʵ¼ÊÉÏÊDz»ÔÊÐíµÄ
    Object o = lsa;
    Object[] oa = (Object[]) o;
    List<Integer> li = new ArrayList<Integer>();
    li.add(new Integer(8));
    oa[1] = li;//²»ºÏÀí£¬µ«¿ÉÒÔͨ¹ýÔËÐÐʱµÄ¸³Öµ¼ì²â
    String s = lsa[1].get(0);//ÔËÐÐʱ³ö´í£ºClassCastExceptionÒì³£

    Èç¹û²ÎÊý»¯ÀàÐ͵ÄÊý×éÔÊÐíµÄ»°£¬ÄÇôÉÏÃæµÄÀý×Ó±àÒëʱ¾Í²»»áÓÐδ¼ì²âµÄ¾¯¸æ£¬
µ«ÔÚÔËÐÐʱ³ö´í¡£¶ÔÓÚ·ºÐͱà³Ì£¬ÎÒÃǵÄÖ÷ÒªÉè¼ÆÄ¿±êÊÇÀàÐͰ²È«£¬¶øÌرðµÄÊÇÕâ¸ö
ÓïÑÔµÄÉè¼Æ±£Ö¤ÁËÈç¹ûʹÓÃÁËjavac -source 1.5À´±àÒëÕû¸ö³ÌÐò¶øÃ»ÓÐδ¼ì²âµÄ
¾¯¸æµÄ»°£¬ËüÊÇÀàÐͰ²È«µÄ¡£
    µ«ÊÇÄãÈÔÈ»»áʹÓÃͨÅä·ûÊý×飬ÕâÓëÉÏÃæµÄ´úÂëÏà±ÈÓÐÁ½¸ö±ä»¯¡£Ê×ÏÈÊDz»Ê¹ÓÃ
Êý×é¶ÔÏó»òÔªËØÀàÐͱ»²ÎÊý»¯µÄÊý×éÀàÐÍ£¬ÕâÑùÎÒÃǾÍÐèÒªÔÚ´ÓÊý×éÖÐÈ¡³öÒ»¸ö×Ö·û
´®µÄʱºò½øÐÐÇ¿ÖÆÀàÐÍת»»£º

    List<?>[] lsa = new List<?>[10];//ûÎÊÌ⣬ÎÞ½çͨÅä·ûÀàÐÍÊý×é
    Object o = lsa;
    Object[] oa = (Object[]) o;
    List<Integer> li = new ArrayList<Integer>();
    li.add(new Integer(3));
    oa[1] = li;//ÕýÈ·
    String s = (String) lsa[1].get(0);//ÔËÐÐʱ´íÎó£¬ÏÔÊ½Ç¿ÖÆÀàÐÍת»»

    µÚ¶þ¸ö±ä»¯ÊÇ£¬ÎÒÃDz»´´½¨ÔªËØÀàÐͱ»²ÎÊý»¯µÄÊý×é¶ÔÏ󣬵«ÈÔȻʹÓòÎÊý»¯ÔªËØ
ÀàÐ͵ÄÊý×éÀàÐÍ£¬ÕâÊÇÔÊÐíµÄ£¬µ«ÒýÆðÏÖδ¼ì²â¾¯¸æ¡£ÕâÑùµÄ³ÌÐòʵ¼ÊÉÏÊDz»°²È«µÄ£¬
ÉõÖÁ×îÖÕ»á³ö´í¡£

    List<String>[] lsa = new List<?>[10];//δ¼ì²â¾¯¸æ-ÕâÊDz»°²È«µÄ£¡
    Object o = lsa;
    Object[] oa = (Object[]) o;
    List<Integer> li = new ArrayList<integer>();
    li.add(new Integer(3));
    oa[1]=li;//ÕýÈ·
    String s = lsa[1].get(0);//ÔËÐгö´í£¬µ«Ö®Ç°ÒѾ­±»¾¯¸æ

    ÀàËÆµØ£¬Ïë´´½¨Ò»¸öÔªËØÀàÐÍÊÇÀàÐͱäÁ¿µÄÊý×é¶ÔÏóµÄ»°£¬½«»á±àÒë³ö´í¡£

    <T> T[] makeArray(T t){
      return new T[100];//´íÎó
    }

    ÒòΪÀàÐͱäÁ¿²¢²»´æÔÚÓÚÔËÐÐʱ£¬ËùÒÔûÓа취֪µÀʵ¼ÊµÄÊý×éÀàÐÍÊÇʲô¡£
    ÒªÍ»ÆÆÕâÀàÏÞÖÆ£¬ÎÒÃÇ¿ÉÒÔÓõÚ8²¿·Ö˵µ½µÄÓÃÀàÃû×÷ΪÔËÐÐʱ±ê¼ÇµÄ·½·¨¡£

ynwll ·¢±íÓÚ 2004-11-27 16:24

°Ë¡¢ °ÑÀàÃû×÷ΪÔËÐÐʱµÄÀàÐͱê¼Ç

JDK1.5ÖеÄÒ»¸ö±ä»¯ÊÇjava.lang.ClassÊÇ·º»¯µÄ£¬Ò»¸öÓÐȤµÄÀý×ÓÊǶÔ
ÈÝÆ÷ÍâµÄ¶«Î÷ʹÓ÷ºÐÍ¡£
    ÏÖÔÚClassÀàÓÐÒ»¸öÀàÐͲÎÊýT£¬Äã¿ÉÄÜ»áÎÊ£¬T´ú±íʲô°¡£¿Ëü¾Í´ú±íClass
¶ÔÏóËù±íʾµÄÀàÐÍ¡£
    ±ÈÈ磬String.classµÄÀàÐÍÊÇClass<String>£¬Serializable.classµÄ
ÀàÐÍÊÇClass<Serializable>£¬Õâ¿ÉÒÔÌá¸ßÄãµÄ·´Éä´úÂëÖеÄÀàÐͰ²È«ÐÔ¡£
    ÌØ±ðµØ£¬ÓÉÓÚÏÖÔÚClassÀàÖеÄnewInstance()·½·¨·µ»ØÒ»¸öT¶ÔÏó£¬Òò´Ë
ÔÚͨ¹ý·´Éä´´½¨¶ÔÏóµÄʱºò¿ÉÒԵõ½¸ü¾«È·µÄÀàÐÍ¡£
    ÆäÖÐÒ»¸ö·½·¨¾ÍÊÇÏÔʽ´«ÈëÒ»¸öfactory¶ÔÏ󣬴úÂëÈçÏ£º

    interface Factory<T> {T make();}
    public <T> Collection<T> select(Factory<T> factory, String statement){
        Collection<T> result = new ArrayList<T>();
        //ÓÃJDBCÔËÐÐSQL²éѯ
        for(/*±éÀúJDBC½á¹û*/){
          T item = factory.make();
          /*ͨ¹ýSQL½á¹ûÓ÷´ÉäºÍÉèÖÃÊý¾ÝÏî*/
          result.add(item);
        }
        return result;
    }

    Äã¿ÉÒÔÕâÑùµ÷Óãº

    select(new Factory<EmpInfo>(){ public EmpInfo make() {
                                    return new EmpInfo();
                                }}
        , "selection string");
   
    »òÕßÉùÃ÷Ò»¸öEmpInfoFactoryÀàÀ´Ö§³ÖFactory½Ó¿Ú£º

    class EmpInfoFactory implements Factory<EmpInfo>{
        ...
        public EmpInfo make() { return new EmpInfo();}
    }

    È»ºóÕâÑùµ÷Óãº

    select(getMyEmpInfoFactory(), "selection string");

    ÕâÖÖ½â¾ö°ì·¨ÐèÒªÏÂÃæµÄÆäÖÐÖ®Ò»£º
    ? ÔÚµ÷Óõĵط½Ê¹ÓÃÏêϸµÄÄäÃû¹¤³§Àà(verbose anonymous factory classes)£¬»òÕß
    ? Ϊÿ¸öʹÓõÄÀàÐÍÉùÃ÷Ò»¸ö¹¤³§À࣬²¢°Ñ¹¤³§ÊµÀý´«µÝ¸øµ÷Óõĵط½£¬ÕâÑùÓе㲻×ÔÈ»¡£

    ʹÓÃÀàÃû×÷Ϊһ¸ö¹¤³§¶ÔÏóÊǷdz£×ÔÈ»µÄÊ£¬ÕâÑùµÄ»°»¹¿ÉÒÔΪ·´ÉäËùÓá£ÏÖÔÚ
ûÓзºÐ͵ĴúÂë¿ÉÄÜд×÷ÈçÏ£º
   
    Collection emps = sqlUtility.select(EmpInfo.class, "select * from emps");
    ...
    public static Collection select(Class c, String sqlStatement) {
        Collection result = new ArrayList();
        /*ÓÃJDBCÖ´ÐÐSQL²éѯ*/
        for(/*±éÀúJDBC²úÉúµÄ½á¹û*/){
          Object item = c.newInstance();
          /*ͨ¹ýSQL½á¹ûÓ÷´ÉäºÍÉèÖÃÊý¾ÝÏî*/
          result.add(item);
        }
        return result;
    }

    µ«ÊÇ£¬ÕâÑù²¢²»Äܵõ½ÎÒÃÇËùÏ£ÍûµÄ¸ü¾«È·µÄ¼¯ºÏÀàÐÍ£¬ÏÖÔÚClassÊÇ·º»¯µÄ£¬
ÎÒÃÇ¿ÉÒÔÕâÑùд£º
   
    Collection<EmpInfo> emps =
                sqlUtility.select(EmpInfo.class, "select * from emps");
    ...
    public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
        Collection<T> result = new ArrayList<T>();
        /*ÓÃJDBCÖ´ÐÐSQL²éѯ*/
        for(/*±éÀúJDBC²úÉúµÄ½á¹û*/){
          T item = c.newInstance();
          /*ͨ¹ýSQL½á¹ûÓ÷´ÉäºÍÉèÖÃÊý¾ÝÏî*/
          result.add(item);
        }
        return result;
    }

    ÕâÑù¾Íͨ¹ýÀàÐͰ²È«µÄ·½·¨À´µÃµ½Á˾«È·µÄ¼¯ºÏÀàÐÍÁË¡£
    ÕâÖÖʹÓÃÀàÃû×÷ΪÔËÐÐʱÀàÐͱê¼ÇµÄ¼¼ÊõÊÇÒ»¸öºÜÓÐÓõļ¼ÇÉ£¬ÊÇÐèÒªÖªµÀµÄ¡£
ÔÚ´¦Àí×¢Ê͵ÄеÄAPIÖÐÒ²ÓкܶàÀàËÆµÄÇé¿ö¡£

ynwll ·¢±íÓÚ 2004-11-27 16:25

¾Å ͨÅä·ûµÄÆäËû×÷ÓÃ

£¨more fun with wildcards£¬²»ÖªµÀÈçºÎÒë²Å±È½ÏÍ×µ±£¬ºÇºÇ¡££©

    ÔÚÕⲿ·Ö£¬ÎÒÃǽ«»á×Ðϸ¿´¿´Í¨Åä·ûµÄ¼¸¸ö½ÏΪÉîÈëµÄÓÃ;¡£ÎÒÃÇÒѾ­´Ó¼¸¸ö
ÓнçͨÅä·ûµÄÀý×ÓÖп´µ½£¬Ëü¶Ô´ÓijһÊý¾Ý½á¹¹ÖжÁÈ¡Êý¾ÝÊǺÜÓÐÓõġ£ÏÖÔÚÀ´¿´
¿´Ïà·´µÄÇé¿ö£¬Ö»¶ÔÊý¾Ý½á¹¹½øÐÐд²Ù×÷¡£
    ÏÂÃæµÄSink½Ó¿Ú¾ÍÊÇÕâÀàÇé¿öµÄÒ»¸ö¼òµ¥µÄÀý×Ó£º

    interface Sink<T> {
      flush(T t);
    }

    ÎÒÃÇ¿ÉÒÔÏëÏóÔÚÏÂÃæµÄʾ·¶µÄÀý×ÓÖÐʹÓÃËü£¬writeAll()·½·¨ÓÃÓÚ°Ñcoll¼¯ºÏ
ÀïµÄËùÓÐÔªËØÌî³ä(flush)µ½Sink½Ó¿Ú±äÁ¿snkÖУ¬²¢·µ»Ø×îºóÒ»¸öÌî³äµÄÔªËØ¡£

    public static <T> T writeAll(Collection<T> coll, Sink<T> snk){
        T last;
        for (T t: coll){
            last = t;
            snk.flush(last);
        }
        return last;
    }
    ...
    Sink<Object> s;
    Collection<String> cs;
    String str = writeAll(cs, s);//·Ç·¨µ÷ÓÃ

    Èç×¢ÊÍËù×¢£¬ÕâÀï¶ÔwriteAll()·½·¨µÄµ÷ÓÃÊÇ·Ç·¨µÄ£¬ÒòΪÎÞÓÐЧµÄÀàÐͲÎÊý
¿ÉÒÔÒýÓã»StringºÍObject¶¼²»ÊʺÏ×÷ΪTµÄÀàÐÍ£¬ÒòΪCollectionºÍSinkµÄÔªËØ
±ØÐëÊÇÏàͬÀàÐ͵ġ£
    ÎÒÃÇ¿ÉÒÔͨ¹ýʹÓÃͨÅä·ûÀ´¸ÄдwriteAll()µÄ·½·¨Í·À´´¦Àí£¬ÈçÏ£º

    public static <T> T writeAll(Collection<? extends T>, Sink<T>) {...}
    ...
    String str = writeAll(cs, s);//µ÷ÓÃûÎÊÌ⣬µ«·µ»ØÀàÐÍ´íÎó

    ÏÖÔÚµ÷ÓÃÊǺϷ¨µÄÁË£¬µ«ÓÉÓÚTµÄÀàÐ͸úÔªËØÀàÐÍÊÇObjectµÄsÒ»Ñù£¬ÒòΪ·µ»ØµÄ
ÀàÐÍÒ²ÊÇObject£¬Òò´Ë¸³ÖµÊDz»ÕýÈ·µÄ¡£
    ½â¾ö°ì·¨ÊÇʹÓÃÎÒÃÇ֮ǰ´Óδ¼û¹ýµÄÒ»ÖÖÓнçͨÅä·ûÐÎʽ£º´øÏ½çµÄͨÅä·û¡£
Óï·¨ ? super T ±íʾÁËÊÇδ֪µÄTµÄ¸¸ÀàÐÍ£¬ÕâÓëÎÒÃÇ֮ǰËùʹÓõÄÓнç
£¨¸¸ÀàÐÍ£º»òÕßTÀàÐͱ¾Éí£¬Òª¼ÇסµÄÊÇ£¬ÄãÀàÐ͹ØÏµÊÇ×Ô·´µÄ£©
ͨÅä·ûÊǶÔżÓнçͨÅä·û£¬¼´Óà ? extends T ±íʾδ֪µÄTµÄ×ÓÀàÐÍ¡£

    public static<T> T writeAll(Collection<T> coll, Sink<? super T> snk) {...}
    ...
    String str = writeAll(cs, s);//ÕýÈ·£¡

    ʹÓÃÕâ¸öÓï·¨µÄµ÷ÓÃÊǺϷ¨µÄ£¬Ö¸ÏòµÄÀàÐÍÊÇËùÆÚÍûµÄStringÀàÐÍ¡£

    ÏÖÔÚÎÒÃÇÀ´¿´Ò»¸ö±È½ÏÏÖʵһµãµÄÀý×Ó£¬java.util.TreeSet<E>±íÊ¾ÔªËØÀàÐÍ
ÊÇEµÄÊ÷ÐÎÊý¾Ý½á¹¹ÀïµÄÔªËØÊÇÓÐÐòµÄ£¬´´½¨Ò»¸öTreeSet¶ÔÏóµÄÒ»¸ö·½·¨ÊÇʹÓòÎÊý
ÊÇComparator¶ÔÏóµÄ¹¹Ô캯Êý£¬Comparator¶ÔÏóÓÃÓÚ¶ÔTreeSet¶ÔÏóÀïµÄÔªËØ½øÐÐ
ËùÆÚÍûµÄÅÅÐò½øÐзÖÀà¡£

    TreeSet(Comparator<E> c)

    Comparator½Ó¿ÚÊDZØÒªµÄ£º

    interface Comparator<T> {
      int compare(T fst, T snd);
    }

    ¼ÙÉèÎÒÃÇÏëÒª´´½¨Ò»¸öTreeSet<String>¶ÔÏ󣬲¢´«ÈëһϺÏÊʵÄComparator
¶ÔÏó£¬ÎÒÃÇ´«µÝµÄComparatorÊÇÄܹ»±È½Ï×Ö·û´®µÄ¡£ÎÒÃÇ¿ÉÒÔÓÃComparator<String>£¬
µ«Comparator<Object>Ò²ÊÇ¿ÉÒԵġ£µ«ÊÇ£¬ÎÒÃDz»ÄܶÔComparator<Object>¶ÔÏó
µ÷ÓÃÉÏÃæËù¸øµÄ¹¹Ô캯Êý£¬ÎÒÃÇ¿ÉÒÔÓÃÒ»¸öϽçͨÅä·ûÀ´µÃµ½ÎÒÃÇÏëÒªµÄÁé»îÐÔ£º

    TreeSet(Comparator<? super E> c)

    ÕâÑù¾Í¿ÉÒÔʹÓÃÊʺϵÄComparator¶ÔÏóÀ²¡£
    ×îºóÒ»¸öϽçͨÅä·ûµÄÀý×Ó£¬ÎÒÃÇÀ´¿´¿´Collections.max()·½·¨£¬Õâ¸ö·½·¨
·µ»Ø×÷Ϊ²ÎÊý´«µÝµÄCollection¶ÔÏóÖÐ×î´óµÄÔªËØ¡£
    ÏÖÔÚ£¬ÎªÁËmax()·½·¨ÄÜÕý³£ÔËÐУ¬´«µÝµÄCollection¶ÔÏóÖеÄËùÓÐÔªËØ¶¼±Ø
ÐëÊÇʵÏÖÁËComparable½Ó¿ÚµÄ£¬»¹ÓоÍÊÇ£¬ËüÃÇÖ®¼ä±ØÐëÊǿɱȽϵġ£
    ÏÈÊÔһϷº»¯·½·¨Í·µÄд·¨£º

    public static <T extends Comparable<T>>
        T max(Collection<T> coll)

    ÄÇÑù£¬·½·¨¾Í½ÓÊÜÒ»¸ö×ÔÉí¿É±È½ÏµÄ£¨comparable£©Ä³¸öTÀàÐ͵ÄCollection
¶ÔÏ󣬲¢·µ»ØTÀàÐ͵ÄÒ»¸öÔªËØ¡£ÕâÑùÏÔµÃÌ«Êø¸¿ÁË¡£
    À´¿´¿´ÎªÊ²Ã´£¬¼ÙÉèÒ»¸öÀàÐÍ¿ÉÒÔÓëºÏÒâµÄ¶ÔÏó½øÐбȽϣº

    class Foo implements Comparable<Object> {...}
    ...
    Collection<Foo> cf = ...;
    Collectins.max(cf);//Ó¦¸Ã¿ÉÒÔÕý³£ÔËÐÐ

    cfÀïµÄÿ¸ö¶ÔÏ󶼿ÉÒÔºÍcfÀïµÄÈÎÒâÆäËûÔªËØ½øÐбȽϣ¬ÒòΪÿ¸öÔªËØ¶¼ÊÇFoo
µÄ¶ÔÏ󣬶øFoo¶ÔÏó¿ÉÒÔÓëÈÎÒâµÄ¶ÔÏó½øÐбȽϣ¬ÌرðÊÇͬÊÇFoo¶ÔÏóµÄ¡£µ«ÊÇ£¬Ê¹ÓÃ
ÉÏÃæµÄ·½·¨Í·£¬ÎÒÃǻᷢÏÖÕâÑùµÄµ÷ÓÃÊDz»±»½ÓÊܵģ¬Ö¸ÏòµÄÀàÐͱØÐëÊÇFoo£¬µ«Foo
²¢Ã»ÓÐʵÏÖComparable<Foo>¡£
    T¶ÔÓÚ×ÔÉíµÄ¿É±ÈÐÔ²»ÊDZØÐëµÄ£¬ÐèÒªµÄÊÇTÓëÆä¸¸ÀàÐÍÊǿɱȵ쬾ÍÏñÏÂÃæ£º
    £¨Êµ¼ÊµÄCollections.max()·½·¨Í·ÔÚºóÃæµÄµÚ10²¿·Ö½«»á½²µÃ¸ü¶à£©

    public static <T extends Comparable<? super T>>
        T max(Collection<T> coll)

    ÕâÑùÍÆÀí³öÀ´µÄ½á¹û»ù±¾ÉÏÊÊÓÃÓÚÏëÓÃComparableÀ´ÓÃÓÚÈÎÒâÀàÐ͵ÄÓ÷¨£º
¾ÍÊÇÄãÏëÕâÑùÓÃComparable<? super T>¡£
    ×ܵÄÀ´Ëµ£¬Èç¹ûÄãÓÐÒ»¸öÖ»ÄÜÒ»¸öTÀàÐͲÎÊý×÷Ϊʵ²ÎµÄAPIµÄ»°£¬Äã¾ÍÓ¦¸ÃÓÃ
ϽçͨÅä·ûÀàÐÍ£¨? suer T£©£»Ïà·´£¬Èç¹ûAPIÖ»·µ»ØT¶ÔÏó£¬Äã¾ÍÓ¦¸ÃÓÃÉϽçͨ
Åä·ûÀàÐÍ£¨? extends T£©£¬ÒÔʹµÃÄãµÄ¿Í»§µÄ´úÂëÓиü´óµÄÁé»îÐÔ¡£

ynwll ·¢±íÓÚ 2004-11-27 16:26

¾Å-1 ͨÅä·û²¶×½£¨£¿wildcard capture£©

ÏÖÔÚÓ¦¸ÃºÜÇå³þ£¬¸ø³öÏÂÃæµÄÀý×Ó£º

    Set<?> unknownSet = new HashSet<String>();
    ...
    /** ¸øSet¶ÔÏósÌí¼ÓÒ»¸öÔªËØt*/
    public static <T> void addToSet<Set<T> s, T t) {...}

    ÏÂÃæµÄµ÷ÓÃÊÇ·Ç·¨µÄ¡£

    addToSet(unknownSet, "abc");//·Ç·¨µÄ

    ÕâÎÞÒìÓÚʵ¼Ê´«µÝµÄSet¶ÔÏóÊÇÒ»¸ö×Ö·û´®ÀàÐ͵ÄSet¶ÔÏó£¬ÎÊÌâÊÇ×÷Ϊʵ²Î´«µÝµÄ
ÊÇÒ»¸öδ֪ÀàÐ͵ÄSet¶ÔÏó£¬ÕâÑù¾Í²»Äܱ£Ö¤ËüÊÇÒ»¸ö×Ö·û´®ÀàÐÍ»òÆäËûÀàÐ͵ÄSet¶ÔÏó¡£
    ÏÖÔÚ£¬À´¿´ÏÂÃæ£º

    class Collections{
    ...
        <T> public static Set<T> unmodifiableSet<Set<T> set) {...}
    }
    ...
    Set<?> s = Collections.unmodifiableSet(unknownSet);//ÕâÊÇ¿ÉÒԵģ¬
                                                        //ÎªÊ²Ã´ÄØ£¿
    ¿´ÆðÀ´ÕâÓ¦¸ÃÊDz»ÔÊÐíµÄ£¬µ«ÊÇÇë¿´¿´Õâ¸öÌØ±ðµÄµ÷Óã¬ÕâÍêÈ«Êǰ²È«µÄ£¬Òò´Ë
ÕâÊÇÔÊÐíµÄ¡£ÕâÀïµÄunmodifiableSet()ȷʵÊǶÔÈκÎÀàÐ͵ÄSet¶¼Êʺϣ¬²»¹ÜËüµÄ
ÔªËØÀàÐÍÊÇʲô¡£
    ÒòΪÕâÖÖÇé¿ö³öÏÖµÃÏà¶ÔƵ·±£¬Òò´Ë¾ÍÓÐÒ»¸öÌØÊâµÄ¹æÔò£¬¶Ô´úÂëÄܹ»±»¼ìÑéÊÇ
°²È«µÄÈκÎÌØ¶¨µÄ»·¾³£¬ÄÇÑùµÄ´úÂë¶¼ÊÇÔÊÐíµÄ¡£Õâ¸ö¹æÔò¾ÍÊÇËùνµÄ¡°Í¨Åä·û²¶×½¡±£¬
ÔÊÐí±àÒëÆ÷¶Ô·ºÐÍ·½·¨ÒýÓÃδ֪ÀàÐ͵ÄͨÅä·û×÷ΪÀàÐÍʵ²Î¡£

ynwll ·¢±íÓÚ 2004-11-27 16:26

Ê® °ÑÒÅÁô´úÂëת»¯Îª·ºÐÍ´úÂë

Ôçǰ£¬ÎÒÃÇչʾÁËÈçºÎʹ·ºÐÍ´úÂëºÍÒÅÁô´úÂë½»»¥£¬ÏÖÔÚ¸ÃÊÇʱºòÀ´¿´¿´¸üÄѵÄ
ÎÊÌ⣺°ÑÀÏ´úÂë¸ÄΪ·ºÐÍ´úÂë¡£
    Èç¹û¾ö¶¨Á˰ÑÀÏ´úÂëת»»Îª·ºÐÍ´úÂ룬Äã±ØÐëÉ÷ÖØ¿¼ÂÇÈçºÎÐÞ¸ÄÄãµÄAPI¡£
    Äã²»ÄܶԷºÐÍAPIÏÞÖÆµÃÌ«ËÀ£¬ËüµÃÒª¼ÌÐøÖ§³ÖAPIµÄ×î³õÔ¼¶¨¡£ÔÙ¿´¼¸¸ö¹ØÓÚ
java.util.CollectionµÄÀý×Ó¡£·Ç·ºÐ͵ÄAPI¾ÍÏñÕâÑù£º

    interface Collection {
      public boolean containsAll(Collection c);
      public boolean addAll(Collection c);
    }

    ÏÈÕâÑù¼òµ¥À´³¢ÊÔһϷº»¯£º

    interface Collection<E> {
      public boolean containsAll(Collection<E> c);
      public boolean addAll(Collection<E> c);
    }

    Õâ¸öµ±È»ÊÇÀàÐͰ²È«µÄ£¬ËüûÓÐ×öµ½APIµÄ×î³õÔ¼¶¨£¬containsAll()·½·¨½ÓÊÜ
´«ÈëµÄÈκÎÀàÐ͵ÄCollection¶ÔÏó£¬Ö»Óе±Collection¶ÔÏóÖÐÖ»°üÀ¨EÀàÐ͵ÄʵÀý
µÄʱºò²ÅÕýÈ·¡£µ«ÊÇ£º
    ? ´«ÈëµÄCollection¶ÔÏóµÄ¾²Ì¬ÀàÐÍ¿ÉÄܲ»Í¬£¬ÕâÑùµÄÔ­Òò¿ÉÄÜÊǵ÷ÓÃÕß²»ÖªµÀ
´«ÈëµÄCollection¶ÔÏóµÄ¾«È·ÀàÐÍ£¬ÓÖ»òÕßËüÊÇCollection<S>ÀàÐ͵쬯äÖÐSÊÇEµÄ
×ÓÀàÐÍ¡£
    ? ¶Ô²»Í¬ÀàÐ͵ÄCollection¶ÔÏóµ÷Ó÷½·¨containsAll()ÍêÈ«ÊǺϷ¨µÄ£¬³ÌÐò
Ó¦¸ÃÄܹ»ÔËÐУ¬·µ»ØµÄÊÇfalseÖµ¡£
    ¶ÔÓÚaddAll()·½·¨ÕâÖÖÇé¿ö£¬ÎÒÃÇÓ¦¸ÃÄܹ»Ìí¼ÓÈκδæÔÚÁËEÀàÐ͵Ä×ÓÀàÐ͵ÄCollection
¶ÔÏó£¬ÎÒÃÇÔÚµÚ5²¿·ÖÖп´¹ýÁËÈçºÎÕýÈ·´¦ÀíÕâÖÖÇé¿ö¡£
    »¹Òª±£Ö¤¸Ä½øµÄAPIÄܹ»±£Áô¶ÔÀϿͻ§µÄ¶þ½øÖÆÖ§³Ö£¨? binary compatibility£©¡£
Õâ¾ÍÒâζ×ÅAPI¡°²Á³ý¡±ºó£¨erasure£©±ØÐëÓë×î³õµÄ·Ç·ºÐÍAPIÒ»Ö¡£ÔÚ´ó¶àÊýµÄÇé
¿öµÄ½á¹ûÊÇ×ÔÈ»¶øÈ»µÄ£¬µ«ÓÐЩСµØ·½È´²»¾¡Èç´Ë¡£ÎÒÃǽ«×Ðϸȥ¿´¿´ÎÒÃÇ֮ǰÓöµ½
¹ýµÄ×îСµÄCollections.max()·½·¨£¬ÕýÈçÎÒÃÇÔÚµÚ9²¿·ÖËù¼û£¬ËƺõÕýÈ·µÄmax()
µÄ·½·¨Í·£º

    public static <T extends Comparable<? super T>>
        T max(CollectionT> coll)

    »ù±¾Ã»ÎÊÌ⣬³ýÁË·½·¨Í·±»¡°²Á³ý¡±ºóµÄÇé¿ö£º

    public static Comparable max(Collection coll)

    ÕâÓëmax()·½·¨×î³õµÄ·½·¨Í·²»Ò»Ñù£º

    public static Object max(Collection coll)

    ±¾À´ÊÇÏëµÃµ½ÏëÒªµÄmax()·½·¨Í·£¬µ«ÊÇû³É¹¦£¬ËùÓÐÀϵĶþ½øÖÆclassÎļþ
µ÷ÓõÄCollections.max()¶¼ÒÀÀµÓÚÒ»¸ö·µ»ØObjectÀàÐ͵ķ½·¨Í·¡£
    ÎÒÃÇ¿ÉÒÔÔÚÀàÐͲÎÊýTµÄ±ß½çÖÐÏÔʽָ¶¨Ò»¸ö¸¸ÀàÐÍÀ´Ç¿ÖƸı䡰²Á³ý¡±µÄ½á¹û¡£

    public static <T extends Object & Comparable<? super T>>
        T max(Collection<T> coll)

    ÕâÊÇÒ»¸ö¶ÔÀàÐͲÎÊý¸ø³ö¶à¸ö±ß½çµÄÀý×Ó£¬Óï·¨ÊÇÕâÑù£ºT1 & T2 ... & Tn.
¶à±ß½çÀàÐͱäÁ¿¶Ô±ß½çÀàÐÍÁбíÖеÄËùÓÐÀàÐ͵Ä×ÓÀàÐͶ¼ÊÇ¿ÉÖªµÄ£¬µ±Ê¹Óöà±ß½ç
ÀàÐ͵Äʱºò£¬±ß½çÀàÐÍÁбíÖеĵÚÒ»¸öÀàÐͽ«±»×÷ΪÀàÐͱäÁ¿¡°²Á³ý¡±ºóµÄÀàÐÍ¡£
    ×îºó£¬ÎÒÃÇÓ¦¸Ã¼Çסmax()·½·¨Ö»ÊÇ´Ó´«ÈëµÄCollection·½·¨ÖжÁÈ¡Êý¾Ý£¬
Òò´ËÒ²¾ÍÊÊÓÃÓÚÀàÐÍÊÇTµÄ×ÓÀàÐ͵ÄÈκÎCollection¶ÔÏó¡£
    ÕâÑù¾ÍÓÐÁËÎÒÃÇJDKÖÐʵ¼ÊµÄ·½·¨Í·£º

    public static <T extends Object & Comparable<? super T>>
        T max(Collection<? extends T> coll)

    ÔÚʵ¼ùÖкÜÉÙ»áÓÐÉæ¼°µ½Õâô¶à¶«Î÷µÄÇé¿ö£¬µ«×¨ÒµÀàÐÍÉè¼ÆÕßÔÚת»»ÏÖÓеÄAPI
µÄʱºòÓ¦¸ÃÓÐËù×¼±¸µÄ×Ðϸ˼ÂÇ¡£
    ÁíÒ»¸öÎÊÌâ¾ÍÊÇҪСÐÄЭ±ä·µ»Ø£¨covariant returns£©µÄÇé¿ö£¬ÄǾÍÊǸĽø
×ÓÀàÖз½·¨µÄ·µ»ØÀàÐÍ¡£Äã²»Ó¦¸ÃÔÚÀÏAPIÖÐʹÓÃÕâ¸öÌØÐÔ¡£
    ¼ÙÉèÄã×î³õµÄAPIÊÇÕâÑùµÄ£º

    public class Foo {
      public Foo create {...}//¹¤³§·½·¨£¬Ó¦¸ÃÊÇ´´½¨ÉùÃ÷µÄÀàµÄÒ»¸öʵÀý
    }
    public class Bar extends Foo {
      public Foo create() {...}//ʵ¼ÊÊÇ´´½¨Ò»¸öBarʵÀý
    }

    ÓÃЭ±ä·µ»ØµÄ»°£¬ÊÇÕâÑù¸Ä£º

    public class Foo {
      public Foo create {...}//¹¤³§·½·¨£¬Ó¦¸ÃÊÇ´´½¨ÉùÃ÷µÄÀàµÄÒ»¸öʵÀý
    }
    public class Bar extends Foo {
      public Bar create() {...}//ʵ¼ÊÊÇ´´½¨Ò»¸öBarʵÀý
    }

    ÏÖÔÚ£¬¼ÙÉèÓÐÕâÑùµÄµÚÈý·½¿Í»§´úÂ룺

    public class Baz extends Bar {
      public Foo create() {...} //ʵ¼ÊÊÇ´´½¨Ò»¸öBazʵÀý
    }

    JavaÐéÄâ»ú²»Ö±½ÓÖ§³Ö²»Í¬·µ»ØÀàÐ͵ķ½·¨µÄ¸²¸Ç£¬±àÒëÆ÷¾ÍÊÇÖ§³ÖÕâÑùµÄ
ÌØÐÔ¡£½á¹û¾ÍÊÇ£¬³ý·ÇÖØ±àÒëBazÀ࣬·ñÔòµÄ»°Ëü²»»áÕýÈ·¸²¸ÇBarÖеÄcreate()
·½·¨¡£´ËÍ⣬BazÀàÐèÒªÐ޸ģ¬ÒòΪÉÏÃæÐ´µÄ´úÂë²»ÄÜͨ¹ý±àÒ룬BazÖÐcreate()
·½·¨µÄ·µ»ØÀàÐͲ»ÊÇBarÀàÖÐcreate()·½·¨µÄ·µ»ØÀàÐ͵Ä×ÓÀàÐÍ¡£

ynwll ·¢±íÓÚ 2004-11-27 16:27

ʮһ¡¢Ãùл£¨ÕâÀï¾Í²»·­ÒëÁË£©

Erik Ernst, Christian Plesner Hansen, Jeff Norton, Mads Torgersen,
Peter von der Ah¡äe and Philip Wadler contributed material to this
tutorial.
Thanks to David Biesack, Bruce Chapman, David Flanagan, Neal Gafter,
¡§ Orjan Petersson, Scott Seligman, Yoshiki Shibata and Kresten Krab
Thorup for valuable feedback on earlier versions of this tutorial.
Apologies to anyone whom I¡¯ve forgotten.

ynwll ·¢±íÓÚ 2004-11-27 16:29

´ËÎÄΪdoyouj
À´×Ô[url]http://bbs.itebook.net/Òë[/url]
ÎÒ¼ûÕâÆªÎÄÕÂÕæÊÇÒëµÄºÜºÃ,±ãתÔÚÕâÀïÁË,
Ôڴ˸Ðл,ҲϣÍû´ó¼Ò×ðÖØdoyouj
ÀͶ¯³É¹û!
ÔٴθÐл!

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.