泛型的幾種正確寫法:
|--List<String> list = new ArrayList<String>(); ----推薦使用的寫法
|--List<String> list = new ArrayList(); ---可以使用,但不推薦,是為了兼容老版本
|--List list = new ArrayList<String>(); ---可以使用,但不推薦,是為了兼容老版本
泛型是什么意思在這就不多說了,而Java中泛型類的定義也比較簡單,例如:public class Test<T>{}。這樣就定義了一個泛型類Test,在實例化該類時,必須指明泛型T的具體類型,例如:Test<Object> t = new Test<Object>();,指明泛型T的類型為Object。
但是Java中的泛型方法就比較復雜了。
- 泛型類,是在實例化類的對象時才能確定的類型,這時需要在創建該類的對象時指明泛型的具體類型;
- 泛型方法,如果讓一個方法可以接收任意的類型,而且調用者傳入什么類型的參數,則該方法的參數類型就是哪一個時,就定義成泛型方法。是在調用方法的時候指明泛型的具體類型。
定義泛型方法語法格式如下:
調用泛型方法語法格式如下:
說明一下,定義泛型方法時,必須在返回值前邊加一個<T>,來聲明這是一個泛型方法,持有一個泛型T,然后才可以用泛型T作為方法的返回值。
Class<T>的作用就是指明泛型的具體類型,而Class<T>類型的變量c,可以用來創建泛型類的對象。
為什么要用變量c來創建對象呢?既然是泛型方法,就代表着我們不知道具體的類型是什么,也不知道構造方法如何,因此沒有辦法去new一個對象,但可以利用變量c的newInstance方法去創建對象,也就是利用反射創建對象。
泛型方法要求的參數是Class<T>類型,而Class.forName()方法的返回值也是Class<T>,因此可以用Class.forName()作為參數。其中,forName()方法中的參數是何種類型,返回的Class<T>就是何種類型。在本例中,forName()方法中傳入的是User類的完整路徑,因此返回的是Class<User>類型的對象,因此調用泛型方法時,變量c的類型就是Class<User>,因此泛型方法中的泛型T就被指明為User,因此變量obj的類型為User。
當然,泛型方法不是僅僅可以有一個參數Class<T>,可以根據需要添加其他參數。
為什么要使用泛型方法呢?因為泛型類要在實例化的時候就指明類型,如果想換一種類型,不得不重新new一次,可能不夠靈活;而泛型方法可以在調用的時候指明類型,更加靈活。
泛型方法代碼演示:

/*代碼演示*/ package com.cnblogs.test; public class Generic { /** * 泛型方法 * @param <T> 聲明一個泛型T * @param c 用來創建泛型對象 * @return * @throws InstantiationException * @throws IllegalAccessException */ public <T> T getObject(Class<T> c) throws InstantiationException, IllegalAccessException{ //創建泛型對象 T t = c.newInstance(); return t; } } //--------------------------------------------------------------------- package com.cnblogs.test; /** * 測試實體模型 * */ public class User { private String uid; private String pwd; public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } //------------------------------------------------------ package com.cnblogs.test; /** * 泛型調用演示 * */ public class GenericTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ Generic generic = new Generic(); //調用泛型方法 Object obj = generic.getObject(Class.forName("com.cnblogs.test.User")); //判斷obj的類型是否是指定的User類型 System.out.println(obj instanceof User); } }
泛型類: 類上的泛型聲明
修飾符 class 類名<泛型>{
}
泛型類中若有static 的方法,則該方法中不能用類的泛型類型(參看代碼):

1 public class Demo6<T> { 2 public static void main(String[] args) { 3 System.out.println(getData2(100)); 4 } 5 6 public T getData(T data) { 7 return data; 8 } 9 10 //靜態方法 11 public static T getData2(T data) { 12 return data; 13 } 14 15 }
編譯以上代碼會出現編譯錯誤:無法從靜態上下文中引用非靜態類。
注意:靜態方法不可以使用類中定義的泛型
因為類中的泛型需要在對象初始化時指定具體的類型,而靜態優先於對象存在。
那么類中的靜態方法如果需要泛型就需要單獨進行泛型聲明,聲明泛型一定要寫在static后,返回值類型之前。
泛型類細節:
1、創建對象的時候要指定泛型的具體類型 2、創建對象時可以不指定泛型的具體類型(和創建集合對象一眼)。默認是Object,例如我們使用集合存儲元素的時候沒有使用泛型就是那么參數的類型就是Object 3、類上面聲明的泛型只能應用於非靜態成員函數,如果靜態函數需要使用泛型,那么 需要在函數上獨立聲明。 4、如果建立對象后指定了泛型的具體類型,那么該對象操作方法時,這些方法只能操作一種數據類型。 5、所以既可以在類上的泛型聲明,也可以在同時在該類的方法中聲明泛型。 |