/*
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,靜态方法不能定義泛型,因為靜态加載時,還不知道有什麼對象,造成沖突;
*/