泛型 – JAVA編程語言程序開發技術文章

泛型
泛型(Generic)—泛形的作用
JDK5以前,對象保存到集合中就會失去其特性,取出時通常要程序員手工進行類型的強制轉換,這樣不可避免就會引發程序的一些安全性問題。例如:
ArrayList list = new ArrayList();
list.add("abc");
Integer num = (Integer) list.get(0);  //運行時會出錯,但編碼時發現不瞭
 
list.add(new Random());
list.add(new ArrayList());
for(int i=0;i<list.size();i++){
       (?)list.get(i);          //此處取出來的對象應轉換成什麼類型
}
JDK5中的泛形允許程序員在編寫集合代碼時,就限制集合的處理類型,從而把原來程序運行時可能發生問題,轉變為編譯時的問題,以此提高程序的可讀性和穩定性(尤其在大型程序中更為突出)。
註意:泛型是提供給javac編譯器使用的,它用於限定集合的輸入類型,讓編譯器在源代碼級別上,即擋住向集合中插入非法數據。但編譯器編譯完帶有泛形的java程序後,生成的class文件中將不再帶有泛形信息,以此使程序運行效率不受到影響,這個過程稱之為“擦除”。
泛形的基本術語,以ArrayList<E>為例:<>念著typeof
•     ArrayList<E>中的E稱為類型參數變量
•     ArrayList<Integer>中的Integer稱為實際類型參數
•     整個稱為ArrayList<E>泛型類型
•     整個ArrayList<Integer>稱為參數化的類型ParameterizedType
泛型的應用
使用迭代器迭代泛形集合中的元素。
使用增強for循環迭代泛形集合中的元素。
存取HashMap中的元素。
使用泛形時的幾個常見問題:
使用泛形時,泛形類型須為引用類型,不能是基本數據類型
ArrayList<String> list = newArrayList<Object>();  //錯
ArrayList<Object> list = newArrayList<String>(); //錯
ArrayList<String> list = newArrayList ();               //行
ArrayList list = new ArrayList<String>();               //行
註:使用泛型
        兩邊的類型必須一致
              ArrayList<String> list =new ArrayList<String>();
        兩邊隻有一邊用泛型(為瞭保持兼容性)
              ArrayList<String> list =new ArrayList ();
              ArrayList list = newArrayList<String>();
定義泛形——泛型方法
Java程序中的普通方法、構造方法和靜態方法中都可以使用泛型。方法使用泛形前,必須對泛形進行聲明,語法:<T> ,T可以是任意字母,但通常必須要大寫。<T>通常需放在方法的返回值聲明之前。例如:
       publicstatic <T> void method(T t);
註意:
•     隻有對象類型才能作為泛型方法的實際參數。
•     在泛型中可以同時有多個類型,例如:
            
如果一個類多處都要用到同一個泛型,這時可以把泛形定義在類上(即類級別的泛型),語法格式如下:
       publicclass GenericDao<T> {
              privateT field1;
              publicvoid save(T obj){}
              publicT getId(int id){}
       }
註意
   *  在類級別上定義的泛型,隻對類的非靜態成員有效
   *  靜態方法不能使用類定義的泛形,而應單獨定義泛形。
泛型的高級應用——通配符
定義一個方法,接收一個集合,並打印出集合中的所有元素,如下所示:
 void print (Collection<String> c) {
          for (String e : c) {
                 System.out.println(e);
          }
}
問題:該方法隻能打印保存瞭String對象的集合,不能打印其它集合。通配符用於解決此類問題,方法的定義可改寫為如下形式:
 void print (Collection<?> c) {   //Collection<?>(發音為:"collection ofunknown")
for (Object e : c) {
       System.out.println(e);
}
}
此種形式下需要註意的是:由於print方法c參數的類型為Collection<?>,即表示一種不確定的類型,因此在方法體內不能調用與類型相關的方法,例如add()方法。
      但可以調用與類型無關的方法,例如size()方法
總結:使用?通配符主要用於引用對象,使用瞭?通配符,就隻能調對象與類型無關的方法,不能調用對象與類型有關的方法。
 
package com.hbsi.csdn;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
public class Demo {
 
       /**
        * @param args
        */
       @SuppressWarnings("unchecked")
       publicstatic void main(String[] args) {
              Listlist=new ArrayList();
              list.add(newStudent("aa",20));
              list.add(newStudent("bb",21));
              list.add(newStudent("cc",20));
              list.add(newStudent("aa",20));
              System.out.println(list);
              list=getList(list);
              System.out.println(list);
            
              HashMap<Student,String> hm=new LinkedHashMap<Student, String>();
              hm.put(newStudent("aa",20), "邯鄲");
              hm.put(newStudent("bb",21), "保定");
              hm.put(newStudent("cc",22), "石傢莊");
              hm.put(newStudent("dd",23), "唐山");
              hm.put(newStudent("ee",24), "邢臺");
            
              Set<Map.Entry<Student,String>> set=hm.entrySet();
              Iterator<Map.Entry<Student,String>> it=set.iterator();
              while(it.hasNext()){
                     Map.Entry<Student,String> me=it.next();
                     System.out.println(me.getKey().getName()+"…"+me.getValue());
                   
              }
       }
       @SuppressWarnings("unchecked")
       publicstatic List getList(List list){
              ListnewList=new ArrayList();
              Iteratorit=list.iterator();
              while(it.hasNext()){
                     Objectobj=it.next();
                     if(!(newList.contains(obj))){
                            newList.add(obj);
                     }
              }
              returnnewList;
            
       }
 
}

發佈留言