【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
文章目錄
- 一、泛型類用法
- 二、泛型方法用法
- 三、泛型通配符 <?>
- 四、泛型安全檢查
- 五、完整代碼示例
- 1、泛型類 / 方法
- 2、main 函數(shù)
一、泛型類用法
泛型類用法 : 使用時先聲明泛型 , 如果不聲明泛型 , 則表示該類的泛型是 Object 類型 ;
泛型類代碼 :
public class Student<T> {private String name;private int age;/*** 該數(shù)據(jù)的類型未知* 使用泛型表示 , 運行時確定該類型*/private T data;public Student(String name, int age, T data) {this.name = name;this.age = age;this.data = data;} }指明泛型類型 : 指定 泛型類 的泛型為 String 類型 , 那么在該類中凡是使用到 T 類型的位置 , 必須是 String 類型 , 泛型類的 泛型聲明 , 使用時在 類名后面 聲明 ;
// 指定 泛型類 的泛型為 String 類型// 那么在該類中凡是使用到 T 類型的位置 , 必須是 String 類型// 泛型類的 泛型聲明 , 使用時在 類名后面 聲明Student<String> student = new Student("Tom", 16, "Cat");String data = student.getData();不指明泛型類型 : 如果不 指明泛型類型 , 則 泛型類型 默認為 Object 類型 ; 如下面的示例 , 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉(zhuǎn)為 String 類型 ;
// 如果不 指明泛型類型// 則 泛型類型 默認為 Object 類型Student student1 = new Student("Tom", 16, "Cat");// 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉(zhuǎn)為 StringString data1 = (String) student1.getData();二、泛型方法用法
泛型方法 : 給下面的泛型方法 , 傳入 String 作為參數(shù) , 則 泛型方法中的 T 的類型就是 String 類型 ;
public <T, A> T getData2(T arg){T data = arg;return data;}指定泛型的方法 : 指定 泛型方法 的泛型類 , 泛型方法 的泛型聲明 , 在調(diào)用時 方法名的前面 聲明 ; 這種用法很少見 ;
// 指定 泛型方法 的泛型類// 泛型方法 的泛型聲明 , 在調(diào)用時 方法名的前面 聲明student.<String, Integer>getData2("Mouse");不指定泛型的方法 : 泛型方法 中 也可以不聲明泛型類型 , 傳入的參數(shù)是 泛型 T 類型 , 如果給傳入?yún)?shù)設(shè)置 String , 隱含將泛型 T 設(shè)置為 String 類型 ;
// 泛型方法 中 也可以不聲明泛型類型// 傳入的參數(shù)是 泛型 T 類型// 如果給傳入?yún)?shù)設(shè)置 String , 隱含將泛型 T 設(shè)置為 String 類型String data2 = student.getData2("Mouse");三、泛型通配符 <?>
如果現(xiàn)在的泛型類型不確定 , 則使用 ? 作為通配符 , 該用法與將泛型類型指定為 Object 類型用法相同 ;
? 通配符用法示例 :
// 使用 <?> 通配符作為泛型// 默認將泛型指定為 Object 類型Student<?> student2 = new Student("Tom", 16, "Cat");String data2 = (String) student1.getData();上述 ? 通配符用法等效于下面的不指定泛型的用法 :
// 如果不 指明泛型類型// 則 泛型類型 默認為 Object 類型Student student1 = new Student("Tom", 16, "Cat");// 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉(zhuǎn)為 StringString data1 = (String) student1.getData();四、泛型安全檢查
注意下面 222 種泛型的用法 , 推薦使用第一種方法 ;
// 泛型的安全檢查// 推薦寫法Student<String> student3 = new Student<>("Tom", 16, "Cat");// 不推薦寫法Student student4 = new Student<String>("Tom", 16, "Cat");使用 new 關(guān)鍵字創(chuàng)建對象 , 是發(fā)生在運行時 , 也就是 new Student<String>("Tom", 16, "Cat") 代碼是在運行時才會執(zhí)行 , 根本起不到 編譯時 安全檢查 的作用 , 從 安全檢查 方面考慮 , 這種寫法沒有意義 ;
以 List 泛型為例 :
- 編譯期進行安全檢查示例 :
會報如下錯誤 ;
- 編譯期不進行安全檢查示例 :
該代碼沒有任何報錯 ;
五、完整代碼示例
1、泛型類 / 方法
/*** 泛型類* 該 T 類型作為參數(shù)使用* T 是參數(shù)化類型 , 可以由外部傳入** @param <T>*/ public class Student<T> {private String name;private int age;/*** 該數(shù)據(jù)的類型未知* 使用泛型表示 , 運行時確定該類型*/private T data;public Student(String name, int age, T data) {this.name = name;this.age = age;this.data = data;}/*** 該方法不是泛型方法* 該方法是普通方法 , 返回值類型是 T 類型* @return*/public T getData() {return data;}public void setData(T data) {this.data = data;}/*** 泛型方法 , 是將某個類型作為參數(shù)傳入* 方法指定泛型 , 寫法如下 ;** 該方法是泛型方法* 方法指定了 2 個泛型* 泛型個數(shù) , 泛型的個數(shù)可以有很多個* 多個泛型之間 , 使用逗號隔開** 泛型方法指定的泛型 T 與類中的泛型 T 沒有任何關(guān)系* 這兩個 T 可以是不同的類型** 泛型方法中定義的泛型 T* 與參數(shù)類型的 T* 返回值類型的 T* 方法內(nèi)部的 T* 都是同一個類型** 與泛型類中的 T 完全沒有關(guān)系** @param <T>* @param <A>* @return*/public <T, A> T getData2(T arg){T data = arg;return data;}public <T> T getData4(T arg){T data = arg;return data;}/*** 如果靜態(tài)方法中使用類 類中的泛型* 這種使用時錯誤的** 如果必須在 靜態(tài)方法 中使用泛型 T* 則該泛型 T 必須是靜態(tài)方法的泛型* 不能是類的泛型** @param arg* @return*/public static <T> T getData3(T arg){T data = arg;return data;} }
2、main 函數(shù)
import java.util.ArrayList; import java.util.List;public class Main {public static void main(String[] args) {// 指定 泛型類 的泛型為 String 類型// 那么在該類中凡是使用到 T 類型的位置 , 必須是 String 類型// 泛型類的 泛型聲明 , 使用時在 類名后面 聲明Student<String> student = new Student("Tom", 16, "Cat");String data = student.getData();// 如果不 指明泛型類型// 則 泛型類型 默認為 Object 類型Student student1 = new Student("Tom", 16, "Cat");// 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉(zhuǎn)為 StringString data1 = (String) student1.getData();// 使用 <?> 通配符作為泛型// 默認將泛型指定為 Object 類型Student<?> student2 = new Student("Tom", 16, "Cat");String data2 = (String) student1.getData();// 泛型的安全檢查// 推薦寫法Student<String> student3 = new Student<>("Tom", 16, "Cat");// 不推薦寫法Student student4 = new Student<String>("Tom", 16, "Cat");// 指定 泛型方法 的泛型類// 泛型方法 的泛型聲明 , 在調(diào)用時 方法名的前面 聲明student.<String, Integer>getData2("Mouse");// 泛型方法 中 也可以不聲明泛型類型// 傳入的參數(shù)是 泛型 T 類型// 如果給傳入?yún)?shù)設(shè)置 String , 隱含將泛型 T 設(shè)置為 String 類型String data3 = student.getData2("Mouse");// 編譯器 在 編譯期 進行檢查List<String> list1 = new ArrayList<>();list1.add(1);// 編譯器 在 編譯期 不進行檢查List list2 = new ArrayList<String>();//list2.add(1);} }
總結(jié)
以上是生活随笔為你收集整理的【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 泛型】泛型简介 ( 泛型类
- 下一篇: 【Java 泛型】泛型用法 ( 泛型编译