工作小驛

          Ninja!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks

                上節課我們留下了一個泛型聲明的概念,這個概念乍一聽起來是很陌生的,不過不要緊,聽我細細道來。泛型聲明就是泛泛的聲明類型。我們用其它的語言做一個比較:

             Javascript聲明變量: var i= 1;var c = ‘char ’

             VB 聲明變量:      dim i=1;dim c=’char’

             Perl 聲明變量:      $i = 1; $c = ‘char’

               這些腳本語言,在聲明變量的時候,根本就不想java那樣還得聲明類型。他們的類型已經自己聲明完了,是泛泛的聲明的,這些語言本身就是泛型。因為數據類型可能會改變,所以用不著像java定的那么死。但是數據類型可不是說變就變的,java的強類型機制,保證了邏輯的嚴謹性,而且確保著程序員犯錯誤,這是java的優點。同時使得它開發起來沒有上述語言那樣簡單,一點小事上做起來都很笨拙。這是其中一個方面,另一個方面如我們上節講的java的集合類里面的類型是不確定的,放什么都行啊。這樣的話你明明自己放進去的類型,也就是說你自己已經知道類型了,拿出來的時候,還得不斷的轉換。我們在介紹拆箱與裝箱機制的時候已經說過這個類型的問題了。拆箱與裝箱確實能解決不少問題但那是不夠的。

              所以接著上節課學集合類的勁頭,趁熱打鐵。我們講一下剛才說的第二個方面,關于集合類的問題。我們剛才說,java這種類型安全之下的破綻,我們要用泛型的方式來彌補。我們來實踐一個例子。實踐:

          import java.io.IOException;

          import java.io.PrintStream;

          import java.util.HashMap;

          import java.util.Iterator;

          import java.util.LinkedList;

          import java.util.List;

          import java.util.Map;

          public class GenericsTester {

           public void testTypeSafeMaps(PrintStream out) throws IOException {

              Map<Integer, Integer> squares = new HashMap<Integer, Integer>();

           

              for (int i=0; i<100; i++) {

                squares.put(i, i*i);

              }

              for (int i=0; i<10; i++) {

                int n = i*3;

                out.println(n + "的平方是" + squares.get(n));

              }

           }

          //測試安全的鏈表

           public void testTypeSafeLists(PrintStream out) throws IOException {

              List listOfStrings = getListOfStrings();

              for (Iterator i = listOfStrings.iterator(); i.hasNext(); ) {

                String item = (String)i.next();

              }

              List<String> onlyStrings = new LinkedList<String>();

              onlyStrings.add("Legal addition");

              /**

               * Uncomment these two lines for an error

              onlyStrings.add(new StringBuilder("Illegal Addition"));

              onlyStrings.add(25);

               */

           }

           public void testTypeSafeIterators(PrintStream out) throws IOException {  //初始化迭代

              List<String> listOfStrings = new LinkedList<String>();

              listOfStrings.add("Happy");

              listOfStrings.add("Birthday");

              listOfStrings.add("To");

              listOfStrings.add("You");

           

              for (Iterator<String> i = listOfStrings.iterator(); i.hasNext();) {

                String s = i.next();

                out.println(s);

              }

              printListOfStrings(getListOfStrings(), out);

           }

          //得到普通鏈表

           private List getList() {

              List list = new LinkedList();

              list.add(3);

              list.add("Blind");

              list.add("Mice");

              return list;

           } 

           //得到安全的鏈表

           private List<String> getListOfStrings() {

              List<String> list = new LinkedList<String>();

              list.add("Hello");

              list.add("World");

              list.add("How");

              list.add("Are");

              list.add("You?");

              return list;

           }

           public void testTypeSafeReturnValues(PrintStream out) throws IOException {

              List<String> strings = getListOfStrings();

              for (String s : strings) {

                out.println(s);

              }

           } //接受參數化類型的鏈表

           private void printListOfStrings(List<String> list, PrintStream out)

              throws IOException {

              for (Iterator<String> i = list.iterator(); i.hasNext(); ) {

                out.println(i.next());

              }

           }

           public void printList(List<?> list, PrintStream out) throws IOException {    for (Iterator<?> i = list.iterator(); i.hasNext(); ) {

                out.println(i.next().toString());

              }

           }

           public static void main(String[] args) {

              GenericsTester tester = new GenericsTester();

              try {

                tester.testTypeSafeLists(System.out);

                tester.testTypeSafeMaps(System.out);

                tester.testTypeSafeIterators(System.out);

                tester.testTypeSafeReturnValues(System.out);

           

                List<Integer> ints = new LinkedList<Integer>();

                ints.add(1);

                ints.add(2);

                ints.add(3);

                tester.printList(ints, System.out);

              } catch (Exception e) {

                e.printStackTrace();

              }

           }

          } 此例子打包下載

          ListMap類的后面有個<>的參數,這個參數表示集合類里面的元素類型。List<String>就是表示,List里面的元素都是String類型的。這樣我們就可以在事先確定List的類型了,省著大家一起做項目的時候。只知道List里面有什么還得問寫的那個人,你同事寫完了還得給你講那里面是什么。這回你看著方法名就全知道了。關于泛型的概念還有很多我們不能一下子講完,以后的教程我們會詳細講解。

          posted on 2007-07-28 10:40 王君 閱讀(170) 評論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 浮山县| 苍溪县| 杭锦后旗| 临洮县| 阳原县| 华容县| 五华县| 剑河县| 广丰县| 西乌珠穆沁旗| 东乡族自治县| 霍城县| 洛宁县| 隆尧县| 南部县| 连云港市| 文安县| 竹溪县| 梁山县| 汽车| 肇庆市| 河曲县| 永州市| 从江县| 麦盖提县| 东辽县| 双流县| 台江县| 军事| 紫阳县| 介休市| 怀仁县| 北宁市| 鄂尔多斯市| 来宾市| 临桂县| 乐清市| 闸北区| 宁海县| 和静县| 周口市|