黑馬程序員 java基礎加強 泛型

                       ------- android培訓java培訓期待與您交流! ----------

 

一、泛型的出現

1、泛型是在JDK1.5以後出現的新特性。泛型是用於解決安全問題的,是一個安全機制。

2、JDK1.5的集合類希望在定義集合時,明確表明你要向集合中裝入那種類型的數據,無法加入指定類型以外的數據。

3、泛型是提供給javac編譯器使用的可以限定集合中的輸入類型說明的集合時,會去掉“類型”信息,使程序運行效率不受影響,對參數化的泛型類型,getClass()方法的返回值和原始類型完全一樣。

4、由於編譯生成的字節碼會去掉泛型的類型信息,只要能跳過編譯器,就可以往某個泛型集合中加入其它類型的數據,如用反射得到集合,再調用add方法即可。

二、好處

1、使用泛型集合,可將一個集合中的元素限定爲一個特定類型,集合中只能存儲同一個類型的對象;這樣就將運行時期出現的問題ClassCastException轉移到了編譯時期,方便與程序員解決問題,讓運行時期問題減少,提高安全性。

2、當從集合中獲取一個對象時,編譯器也可知道這個對象的類型,不需要對對象進行強制轉化,避免了強制轉換的麻煩,這樣更方便。

三、泛型格式:

     通過<>來定義要操作的引用數據類型

     如:TreeSet<String>     -----> 來定義要存入集合中的元素指定爲String類型

四、泛型定義中的術語

如:ArrayList<E>類和ArrayList<Integer>

1、ArrayList<E>整個稱爲泛型類型

2、ArrayList<E>中的E稱爲類型變量或類型參數

3、整個ArrayList<Integer>稱爲參數化類型

4、ArrayList<Integer>中的Integer稱爲類型參數的實例或實際類型參數

5、ArrayList<Integer>中的<>稱爲typeof

6、ArrayList稱爲原始類型

 

五、在使用java提供的對象時,何時寫泛型?

     通常在集合框架中很常見,只要見到<>就要定義泛型,其實<>就是用來接收類型的,當使用集合時,將集合中要存儲的數據類型作爲參數傳遞到<>中即可。

 六、關於參數化類型的幾點說明:

    1、參數化類型與原始類型的兼容性

        第一、參數化類型可引用一個原始類型的對象,編譯只是報警告,能不能通過編譯,是編譯器說了算。

             如:Collection<String> coll = new Date();

        第二、原始類型可引用一個參數化類型的對象,編譯報告警告

             如:Collection coll = new Vector<String>();

              原來的方法接受一個集合參數,新類型也要能傳進去。

    2、參數的類型不考慮類型參數的繼承關係:

               Vector<String> v = new Vector<Objec>();//false

                      不寫Object沒錯

               Vector<Objec> v = new Vector<String>();//錯誤的

    3、在創建數組實例時,數組的元素不能使用參數化的類型

              如:Vector<Integer> v[] = newVector<Integer>[10];//false

代碼體現:

HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>(); //泛型
  //廷加元素。
  HashMap<String,String> yr = new HashMap<String, String>();
  yr.put("01","zhangsan");
  yr.put("02", "lisi");
  czbk.put("yr", yr);
  HashMap<String,String> jy = new HashMap<String, String>();

六、泛型中的通配符?

當傳入的類型不確定時,可以使用通配符?

1、使用?通配符可引用其他各種類型化的類型,通配符的變量主要用作引用,也可調用與參數化無關的方法,但不能調用與參數化有關的方法。

2、可對通配符變量賦任意值:

代碼體現:

public static void printFx(Collection<?> c){  
      for(Object obj : c){ 
        System.out.println(obj); 
    } 

七、泛型方法

1、何時定義泛型方法:爲了讓不同方法可以操作不同的類型,而且類型不確定,那麼就可以定義泛型方法

2、特殊之處:靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的引用數據類型不確定,可以將泛型定義在方法上。

二、泛型方法的特點:

1、位置:用於放置泛型的類型參數的<>應出現在方法的其他所有修飾符之後和在方法的返回類型之前,也就是緊鄰返回值之前,按照慣例,類型參數通常用單個大寫字母表示。

2、只有引用類型才能作爲泛型方法的實際參數

3、除了在應用泛型時可以使用extends限定符,在定義泛型時也可以使用extends限定符。

4、普通方法、構造函數和靜態方法中都可以使用泛型。

5、可以用類型變量表示異常,稱之爲參數化的異常,可用於方法的throws列表中,但是不能用於catch子句中。

6、在泛型中可同時有多個類型參數,在定義它們的<>中用逗號分開。

代碼體現:

   public static <K,V> V getValue(K key){  
            Map<K, V> map = new HashMap<K, V>();  
              return map.get(key);  

               ------- android培訓java培訓期待與您交流! ----------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章