1、List<?>
List<?> 這樣去定義的話和List<Object>是一個意思,這樣就可以避免到時候從list中取值使用的時候出現運作時異常,加上泛型定義之後,在往list中添加元素的時候就必須是定義的元素,否則編譯會報錯,例如定義List<String>a=new ArrayList<String>();這樣的話,a中就隻能添加字元串,其它類型添加不了,特别作用就是避免運作時異常。
?是泛型的通配符,代表不确定,表示沒有或隻有一個.
2、泛型類:
public class Gen<T> {
private T t;
public Gen(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
Public voidfun(T t,String name){
…
if (t instanceof String[]) {//數組
} else if (t instanceof Map) {//Map
}
}
}
我們可以看到T是一個不确定的類。我們在聲明、執行個體化Gen的時候,可以使用:
Gen<String>gen1=new Gen<String>("");
Gen<Integer>gen2=newGen<Integer>(1);
注:泛型類中,泛型的類型可以有多個(使用“,”隔開);泛型的參數也可以使用extends語句(稱作有界類型);
注:泛型類,是在執行個體化類的時候指明泛型的具體類型;泛型方法,是在調用方法的時候指明泛型的具體類型。
3、泛型方法:
public class GenMethod {
public static <T> void display(T t) {
System.out.println(t.getClass());
}
}
或者
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM4gTN5kTZmVWO2ImZ3kTYyYzX2ADN0QTM1EzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
說明一下,定義泛型方法時,必須在傳回值前邊加一個<T>,來聲明這是一個泛型方法,持有一個泛型T,然後才可以用泛型T作為方法的傳回值。
Class<T>的作用就是指明泛型的具體類型,而Class<T>類型的變量c,可以用來建立泛型類的對象。
為什麼要用變量c來建立對象呢?既然是泛型方法,就代表着我們不知道具體的類型是什麼,也不知道構造方法如何,是以沒有辦法去new一個對象,但可以利用變量c的newInstance方法去建立對象,也就是利用反射建立對象。