天天看點

Java泛型總結(集合泛型、方法泛型、通配符)

/*
1,泛型的限定
	*/
	public static void main(String[] args) 
	{
		Class<Number> x=String.class.asSubclass(Number.class);
		Class<?> x=Class<String> y;

		HashMap<String ,Integer> maps = new HashMap<String,Integer>;
		maps.put("zxx",28);
		maps.put("lhm",25);
		maps.put("flx",35);

		Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
		for (Map.Entry<String,Integer> entry : entrySet)
		{	System.out.println(entry.getKey()+":"+entry.getValue());
		}



		swap(new String[]{"abc","xyz","itcast"},1,2);
		swap(new Integer[]{1,3,5,6,7},2,3);//泛型參數必須為引用類型;
	}
/*2,泛型方法:
泛型類定義的反應,在整個類中有效,如果被方法使用,那麼泛型類的對象明确要操作的具體類型後,所有要操作的類型就已經固定了.

為了讓不同方法可以操作不同類型,而且類型還不确定,那麼可以将泛型定義在方法上.

*/
	private static <T> void swap(T[] a,int i,int j){//在傳回類型前寫<泛型>,數組也是前寫<泛型>
		T tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
	}

	add(3,5);
	Number x1 = add(3.5,3);//傳回是Number類型
	Object x2 = add(3,"abc");//

	private static <T> T add(T x,T y){//在傳回類型前寫<泛型>
		return x+y;
	}
	/*
3,利用泛型的方法限定,來轉換參數類型
	*/
	Object boj="abc";
	String x3 = autoConvert(obj);
	private static <T> T autoConvert(Object obj){
		return (T)obj;
	}
/*
4,簡單應用
*/
	private static <T> void fillArray(T[] a,T obj){
		for(int i=0;i<a.length;i++){
			a[i]=obj;
		}
	}
	public static <T> void printCollection(Collection<T> collection,T obj){
		System.out.println(collection.size());
		for (Object obj:collection )
		{	System.out.println(obj);
		}
		collection.add(obj);//用了泛型代替?通配符後,就可引用帶參數的方法了;
	}
/*
5,通配符<?>,也可以了解為占位符号
? extends E:可以接受E類型或者E的子類型 上限 <? extends E>
? super E:可以接受E或E的父類型 下限  <? super E>
ArrayList<? extends Object> al = new ArrayList<String>(); al.add("aa");  //錯  
   因為集合具體對象中既可存儲String,也可以存儲Object的其他子類,是以添加具體的類型對象不合适,類型檢查會出現安全問題.

*/

//6,泛型的傳播
	copy1(new Vector<String>(),new String[10]);//可以
	copy2(new Date[10],new String[10]);//可以
	//copy1(new Vector<Date>(),new String[10]);//錯誤
	public static <T> void copy1(Collection<T> dest,T[] src){
		
	}	
	public static <T> void copy2(T[] dest,T[] src){
		
	}
}
/*
7,new對象時,兩邊的泛型相容性
一邊使用泛型,一邊使用原始類型時,是可以相容的;
兩邊都使用泛型是,泛型參數不具備繼承性;
ArrayList<String> al = new ArrayList<Object>();  //錯

*/

/*
8,定義泛型類型
如果類的執行個體對象中的多處都要用到同一個泛型參數,即這些地方引用的泛型類型要保持同一個實際類型時,這時候就要采用泛型類型的方式進行定義,也就是類級别的泛型.
public class GenericDao<T>{
	public void add(T x){}
	public T findById(int id){}
	public void delete(T obj){}
	public void delete(int id){}
	public void update(T obj){}

	public T findByUserName(){} 
	public Set<T> findByConditions(String where){return null}
}
*/
/*
9,靜态方法不能定義泛型,因為靜态加載時,還不知道有什麼對象,造成沖突;
*/