日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

發布時間:2025/6/17 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、泛型類用法
  • 二、泛型方法用法
  • 三、泛型通配符 <?>
  • 四、泛型安全檢查
  • 五、完整代碼示例
    • 1、泛型類 / 方法
    • 2、main 函數





一、泛型類用法



泛型類用法 : 使用時先聲明泛型 , 如果不聲明泛型 , 則表示該類的泛型是 Object 類型 ;


泛型類代碼 :

public class Student<T> {private String name;private int age;/*** 該數據的類型未知* 使用泛型表示 , 運行時確定該類型*/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 類型 , 需要強轉為 String 類型 ;

// 如果不 指明泛型類型// 則 泛型類型 默認為 Object 類型Student student1 = new Student("Tom", 16, "Cat");// 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉為 StringString data1 = (String) student1.getData();



二、泛型方法用法



泛型方法 : 給下面的泛型方法 , 傳入 String 作為參數 , 則 泛型方法中的 T 的類型就是 String 類型 ;

public <T, A> T getData2(T arg){T data = arg;return data;}

指定泛型的方法 : 指定 泛型方法 的泛型類 , 泛型方法 的泛型聲明 , 在調用時 方法名的前面 聲明 ; 這種用法很少見 ;

// 指定 泛型方法 的泛型類// 泛型方法 的泛型聲明 , 在調用時 方法名的前面 聲明student.<String, Integer>getData2("Mouse");

不指定泛型的方法 : 泛型方法 中 也可以不聲明泛型類型 , 傳入的參數是 泛型 T 類型 , 如果給傳入參數設置 String , 隱含將泛型 T 設置為 String 類型 ;

// 泛型方法 中 也可以不聲明泛型類型// 傳入的參數是 泛型 T 類型// 如果給傳入參數設置 String , 隱含將泛型 T 設置為 String 類型String data2 = student.getData2("Mouse");



三、泛型通配符 <?>



如果現在的泛型類型不確定 , 則使用 ? 作為通配符 , 該用法與將泛型類型指定為 Object 類型用法相同 ;

? 通配符用法示例 :

// 使用 <?> 通配符作為泛型// 默認將泛型指定為 Object 類型Student<?> student2 = new Student("Tom", 16, "Cat");String data2 = (String) student1.getData();

上述 ? 通配符用法等效于下面的不指定泛型的用法 :

// 如果不 指明泛型類型// 則 泛型類型 默認為 Object 類型Student student1 = new Student("Tom", 16, "Cat");// 獲取的 泛型類型的變量也是 Object 類型 , 需要強轉為 StringString data1 = (String) student1.getData();



四、泛型安全檢查



注意下面 222 種泛型的用法 , 推薦使用第一種方法 ;

// 泛型的安全檢查// 推薦寫法Student<String> student3 = new Student<>("Tom", 16, "Cat");// 不推薦寫法Student student4 = new Student<String>("Tom", 16, "Cat");

使用 new 關鍵字創建對象 , 是發生在運行時 , 也就是 new Student<String>("Tom", 16, "Cat") 代碼是在運行時才會執行 , 根本起不到 編譯時 安全檢查 的作用 , 從 安全檢查 方面考慮 , 這種寫法沒有意義 ;


以 List 泛型為例 :

  • 編譯期進行安全檢查示例 :
// 編譯器 在 編譯期 進行檢查List<String> list1 = new ArrayList<>();list1.add(1);

會報如下錯誤 ;

  • 編譯期不進行安全檢查示例 :
// 編譯器 在 編譯期 不進行檢查List list2 = new ArrayList<String>();list2.add(1);

該代碼沒有任何報錯 ;





五、完整代碼示例




1、泛型類 / 方法


/*** 泛型類* 該 T 類型作為參數使用* T 是參數化類型 , 可以由外部傳入** @param <T>*/ public class Student<T> {private String name;private int age;/*** 該數據的類型未知* 使用泛型表示 , 運行時確定該類型*/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;}/*** 泛型方法 , 是將某個類型作為參數傳入* 方法指定泛型 , 寫法如下 ;** 該方法是泛型方法* 方法指定了 2 個泛型* 泛型個數 , 泛型的個數可以有很多個* 多個泛型之間 , 使用逗號隔開** 泛型方法指定的泛型 T 與類中的泛型 T 沒有任何關系* 這兩個 T 可以是不同的類型** 泛型方法中定義的泛型 T* 與參數類型的 T* 返回值類型的 T* 方法內部的 T* 都是同一個類型** 與泛型類中的 T 完全沒有關系** @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* 則該泛型 T 必須是靜態方法的泛型* 不能是類的泛型** @param arg* @return*/public static <T> T getData3(T arg){T data = arg;return data;} }

2、main 函數


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 類型 , 需要強轉為 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");// 指定 泛型方法 的泛型類// 泛型方法 的泛型聲明 , 在調用時 方法名的前面 聲明student.<String, Integer>getData2("Mouse");// 泛型方法 中 也可以不聲明泛型類型// 傳入的參數是 泛型 T 類型// 如果給傳入參數設置 String , 隱含將泛型 T 設置為 String 類型String data3 = student.getData2("Mouse");// 編譯器 在 編譯期 進行檢查List<String> list1 = new ArrayList<>();list1.add(1);// 編譯器 在 編譯期 不進行檢查List list2 = new ArrayList<String>();//list2.add(1);} }

總結

以上是生活随笔為你收集整理的【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎影视库 | 综合色88 | 91爱爱com| 91av国产精品 | 亚洲精品国产精品乱码不99 | 亚洲精品一区二区三区区别 | 国产最新在线视频 | 东北高大丰满bbbbzbbb | 国产黑丝在线播放 | 成人动漫免费在线观看 | 国产一区二区三区免费视频 | 丁香婷婷一区二区三区 | 黄在线观看 | 丝袜黄色片 | 国内激情自拍 | 国产不卡一| 国产欧美一区二区三区在线 | 成人性生交大全免 | 丁香久久综合 | 国产精品看片 | 五月天色视频 | 五月av综合av国产av | 青青草偷拍视频 | 五月婷婷激情四射 | 中文在线8资源库 | 国产精品第56页 | 尤物自拍 | 欧美videos另类精品 | 亚洲一区二区三区四区五区xx | 国产精品51麻豆cm传媒 | 黄色三级视频 | 夜夜骑av| 国产a线 | 国产手机在线 | 国产美女网站视频 | 亚洲国产一二三 | 四虎成人精品永久免费av | 中文字幕在线高清 | 国产高清视频在线观看 | 久久国产热视频 | 欧美一级片播放 | 99精品影视| 女同动漫免费观看高清完整版在线观看 | 国产av无码专区亚洲av毛片搜 | 精品一区久久 | www.国产色 | 精品人妻一区二区三区四区在线 | 青青草超碰在线 | 69人人 | 亚洲国产精品午夜久久久 | 久久久久久一级片 | 91香蕉视频官网 | 九九热精品视频 | 一本久久a精品一合区久久久 | 日本一区二区三区四区五区 | 麻豆md0034在线观看 | 香蕉视频ap| 成人午夜电影网站 | 国产美女精品在线 | 日本一区二区三区视频免费看 | 在线播放成人 | 黑人三级视频 | 精品国产91久久久久久 | 亚洲一级Av无码毛片久久精品 | 国产女人水真多18毛片18精品 | 精品动漫一区 | 狠狠综合久久av一区二区 | 伊人久久伊人 | 美女福利视频一区 | 超碰在线免费 | 亚洲自拍偷拍一区 | 国产成人无码精品久久久电影 | 免费黄网站在线 | 欧美综合日韩 | 日夜夜操 | 麻豆网页 | 日韩免费av片| 欧美巨乳在线观看 | 亚洲第一av在线 | 成人里番精品一区二区 | 精品第一页 | 日本中文字幕二区 | 国产成人自拍视频在线 | 欧洲亚洲精品 | 青娱乐av | 91精品国产综合久久久久久久 | 91看片黄色| 精东传媒在线 | 在线视频午夜 | 大奶一区| 亚洲一区人妻 | 黄a网站| 国产孕妇一区二区三区 | 久久国产精品久久国产精品 | 国内自拍偷拍网 | 国产毛片aaa| 亚洲精品久久久久久久久久久 | 日韩少妇高潮抽搐 | 青娱乐极品视频在线 |