一篇文章帶你弄懂Java集合的泛型

目錄

第一問:什么是泛型?有什么好處?

第二問:泛型是如何實現的呢?

第三問:類型擦除的缺點有哪些?

第四問:泛型中上下界限定符extends和super有什么區別?

第五問:List、List、List之間的區別?

第六問:如何在泛型為Integer的ArrayList中存放一個String類型的對象?


我們用問面試題的方式來講解集合的泛型概念,這樣方便讀者理解。

第一問:什么是泛型?有什么好處?

Java泛型(generics) 是JDK5中引入的一個新特性,允許在定義類和接口的時候使用類型參數(type parameter)。聲明的類型參數在使用時用具體的類型來替換。泛型最主要的應用是在JDK5中的新集合類框架中。

泛型的好處有兩個:

  1. 方便:可以提高代碼的復用性。以List接口為例,我們可以將String、Integer等類型放入List中,如不用泛型,存放String類型要寫一個List接口,存放Integer要寫另外一個List接口,泛型可以很好的解決這個問題。
  2. 安全:在泛型出現之前,通過Object實現的類型轉換需要在運行時檢查,如果類型轉換出錯,程序直接GG,可能會帶來毀滅性打擊。而泛型的作用就是在編譯時做類型檢查,這無疑增加程序的安全性。

第二問:泛型是如何實現的呢?

Java中的泛型通過類型擦除的方式來實現,通俗點理解,就是通過語法糖的形式,在java->.class轉換的階段,將List<String>擦除調轉為List的手段。換句話說,Java的泛型只在編譯期,jvm是不會感知到泛型的。

比如Java的編譯器在編譯以下代碼時:

public class Foo<T> {T bar;void doSth(T param) {}
};Foo<String> f1;
Foo<Integer> f2;

在編譯后的字節碼文件中,會把泛型的信息擦除掉:

public class Foo {Object bar;void doSth(Object param) {}
};

也就是說,在代碼中的Foo<String> 和 Foo<Integer>使用的類,經過編譯后都是同一個類。

所以說泛型技術實際上是Java語言的一顆語法糖,因為泛型經過編譯器處理之后就被擦除了。

這種擦除的過程,被稱之為——類型擦除。所以類型擦除指的是通過類型參數名T,將泛型類型實例關聯到同一份字節碼上。編譯器只為泛型類型生成一份字節碼,并將其實例關聯到這份字節碼上。類型擦除的關鍵在于從泛型類型中清除類型變量的相關信息,并在僅需要的時候插入類型標記和類型轉換的方法。

第三問:類型擦除的缺點有哪些?

  1. 泛型不可以重載
  2. 泛型異常類不可以多次catch
  3. 泛型類中的靜態變量也只有一份,不會有多份

第四問:泛型中上下界限定符extends和super有什么區別?

<? extends T> 表示類型的上界,表示參數化類型可能是T或是T的子類。

// 定義一個泛型方法,接受任何繼承自Number的類型
public <T extends Number> void processNumber(T number) {
// 在這個方法中,可以安全地調用Number的方法
double value = number.doubleValue();
// 其他操作...
}


<? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object。

// 定義一個泛型方法,接受任何類型的List,并向其中添加元素
public <T> void addElements(List<? super T> list, T element) {
list.add(element);
// 其他操作...
}

在使用限定通配符的時候,需要遵守PECS原則,即Producer Extends, Consumer Super:上界生產,下界消費。

如果是從集合中讀取類型T的數據,并且不能寫入,可以使用<? extends 通配符; (Producer Extends),如上面的processNumber方法。

如果是從集合中寫入類型T的數據,并且不需要讀取,可以使用<? super 通配符; (Consumer Super),如上面的addElements方法。

如果既要存又要取,那就不要用任何通配符。

第五問:List<?>、List<Object>、List之間的區別?

  1. List<?> 是一個未知類型的List,而List<Object> 其實是任意類型的List。可以把List<String>、List<Integer>賦值給List<?>,卻不能把List<String>賦值給List<Object>

  2. 可以把任何帶參數的類型傳遞給原始類型List,但卻不能把List<String>賦值給List<Object>,因為會產生編譯錯誤(不支持協變)。

  3. List<?>由于不確定列表中元素的具體類型,因此只能從這種列表中讀取數據,而不能往里面添加除了null之外的任何元素。

public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();test(list);// 編譯出錯test1(list);test2(list);test3(list);}public static void test(List list) {list.add("CLAY");list.add(666);}public static void test1(List<Object> list) {list.add(new Test());}public static void test2(List<?> list) {// 編譯出錯list.add("CLAY");// 編譯正常list.get(0);}public static void test3(List<String> list) {list.add("CLAY");}
}

第六問:如何在泛型為Integer的ArrayList中存放一個String類型的對象?

通過反射可以實現:

List<Integer> list = new ArrayList<>();
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, "Java反射機制實例");
System.out.println(list.get(0));

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19711.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HR人才測評,如何做中層管理人員的素質測評?

中層管理人員是企業中的重要力量&#xff0c;他們是連接高層管理和基層員工的橋梁&#xff0c;對企業的發展至關重要。因此&#xff0c;對中層管理人員的素質測評尤為重要。下面&#xff0c;我將介紹一些HR人才測評的方法和步驟&#xff0c;以幫助企業準確評估中層管理人員的素…

中信銀行積極開展2024年金融科技活動周宣傳活動

近日&#xff0c;2024年全國金融“科技活動周”正式啟動。中信銀行圍繞“弘揚科學家精神 激發全社會創新活力”為主題&#xff0c;積極面向公眾宣傳各類金融知識&#xff0c;全面營造熱愛科學、崇尚科學的社會氛圍。 自5月25日起&#xff0c;中信銀行通過全國網點大屏播放宣傳…

【C++】77組合

給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 使用回溯算法。我們可以按照以下步驟來實現&#xff1a; 創建一個輔助函數 backtrack&#xff0c;用來進行回溯搜索。其中包括當前組合的狀態變量 current、起始…

C# list集合

一、list集合基本使用 1.添加元素 ① 單個元素添加 List<int> list new List<int>();for (int i 0; i < 3; i){list.Add(i);}//輸出&#xff1a;0,1,2 ②初始化時添加元素 List<int> list2 new List<int> { 1, 2, 3 };//輸出&#xff1a;0,1…

Jenkins從放棄到入門:部署、配置與應用

目錄 Jenkins詳解 一、Jenkins介紹 1、Jenkins 功能 2、Jenkins 概念 3、Jenkins 目的 4、Jenkins 特性 5、產品發布流程 二、Jenkins CI/CD 流程 三、部署Jenkins git 1、jenkins 安裝 yum 安裝 jenkins *jenkins 依賴 java 環境 #注意2.346之后的版本不再支持jdk…

RabbitMQ-發布/訂閱模式

1、發布/訂閱模式介紹 在普通的生產者、消費者模式&#xff0c;rabbitmq會將消息依次傳遞給每一個消費者&#xff0c;一個worker一個&#xff0c;平均分配&#xff0c;這就是Round-robin調度方式&#xff0c;為了實現更加復雜的調度&#xff0c;我們就需要使用發布/訂閱的方式…

EXSI虛擬機新增磁盤并將空間擴充到已有分區

這里寫自定義目錄標題 1、在EXSI虛擬機中新增一塊磁盤配置大小2、確認新磁盤3、格式化新分區4、添加新分區到LVM5、將新增分區添加到已有分區里 1、在EXSI虛擬機中新增一塊磁盤配置大小 注意事項&#xff1a; (1)需確保虛擬機已關閉活處于維護模式&#xff0c;避免數據丟失 (2…

Spring Boot詳解:深入了解與實踐

文章目錄 1. Spring Boot簡介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的歷史背景1.3 Spring Boot的核心特點 2. Spring Boot的核心概念2.1 自動配置2.1.1 自動配置原理2.1.2 自定義配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模塊3.1…

網橋、路由器和網關有什么區別

在計算機網絡領域&#xff0c;網橋、路由器和網關都是常見的網絡設備&#xff0c;它們在網絡通信中扮演著不同的角色。雖然它們都有連接不同網絡的功能&#xff0c;但在實際應用中卻具有各自獨特的作用和特點。 1.網橋&#xff08;Bridge&#xff09; 定義&#xff1a;網橋是…

最佳 Mac 數據恢復:恢復 Mac 上已刪除的文件

嘗試過許多 Mac 數據恢復工具&#xff0c;但發現沒有一款能達到宣傳的效果&#xff1f;我們重點介紹最好的 Mac 數據恢復軟件 沒有 Mac 用戶愿意擔心數據丟失&#xff0c;但您永遠不知道什么時候會發生這種情況。無論是意外刪除 Mac 上的重要文件、不小心弄濕了 Mac、感染病毒…

CSS:list-style作用

list-style作用 介紹屬性1. list-style-type2.list-style-image3.list-style-position 常見用法1.設置列表項標記類型2.設置列表項標記圖像3.設置列表項標記位置4.組合使用5.為不同列表項設置不同的樣式6.重置列表樣式 示例 介紹 在Web開發中&#xff0c;list-style 是CSS的一…

ORACLE 查詢SQL優化

1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查詢的執行計劃&#xff0c;這可以幫助你理解查詢是如何被Oracle執行的。基于執行計劃&#xff0c;你可以確定是否存在索引缺失、不必要的全表掃描等問題。 以下是幾種使用EXPLAIN PLAN的方法&#xff1a; 使用EXPLAIN PLAN FOR: 你可以…

【Epoch,Batch,Iteration】深度學習模型訓練相關基礎概念光速理解!

&#x1f525;模型訓練相關基礎概念&#xff01; Epoch: 一次 epoch 代表整個訓練數據集已經被完整地送入神經網絡進行了一輪訓練。通常&#xff0c;模型需要多次 epoch 才能充分學習數據集中的模式。Batch: 由于數據集可能過大&#xff0c;無法一次性全部加載到內存中進行訓練…

解決VSCode右鍵沒有Open In Default Browser問題

在VSCode進行Web小程序測試時&#xff0c;我們在新建的HTML文件中輸入 !會自動生成頁面代碼骨架&#xff0c;寫入內容后&#xff0c;我們想要右鍵在瀏覽器中預覽。發現右鍵沒有“Open In Default Browser”選項。原因是沒有安裝插件。 下面是解決方案&#xff1a;首先在VSCode找…

探索Lora:微調大型語言模型和擴散模型的低秩適配方法【原理解析,清晰簡潔易懂!附代碼】

探索Lora&#xff1a;微調大型語言模型和擴散模型的低秩適配方法 隨著深度學習技術的快速發展&#xff0c;大型語言模型&#xff08;LLMs&#xff09;和擴散模型&#xff08;Diffusion Models&#xff09;在自然語言處理和計算機視覺領域取得了顯著的成果。然而&#xff0c;這…

3d渲染的常用概念和技術,渲染100邀請碼1a12

之前我們介紹了3D渲染的基本原理和流程&#xff0c;這次說下幾個常用概念和技術。 3D渲染中涉及到很多專業的概念和技術&#xff0c;它們決定了渲染質量和效果&#xff0c;常用的有以下幾個。1、光線追蹤 光線追蹤是一些專業渲染器&#xff08;如V-Ray和Corona等&#xff09;…

Android UI控件詳細解析(四)

1.UI控件 1.1 TextView控件 常用屬性 屬性含義id給當前控件定義了一個唯 一標識符layout_width高度&#xff0c;單位&#xff1a;dp (wrap_content, match_parent)layout_height寬度&#xff0c;單位&#xff1a;dp (wrap_content, match_parent)background設置背景圖片text…

Django學習一:創建Django框架,介紹Django的項目結構和開發邏輯。創建應用,編寫主包和應用中的helloworld

文章目錄 前言一、Django環境配置1、python 環境2、Django環境3、mysql環境4、IDE&#xff1a;pycharm 二、第一次創建Django項目1、創建項目door_web_django_system2、運行啟動 三、Django項目介紹1、介紹Django項目結構2、第一個helloword4、django的項目邏輯&#xff08;和j…

React + Taro 項目 實際書寫 感受

之前我總結了部分react 基礎 根據官網的內容 以及Taro 框架的內容 今天我試著開始寫了一下頁面和開發 說一下我的感受 我之前寫的是vue3 今天是第一次真正根據需求做頁面開發 和邏輯功能 代碼的書寫 主體就是開發了這個頁面 雖說這個頁面 很簡單 但是如果你要是第一次寫 難說…

CATIA入門操作案例——壓縮彈簧繪制,螺旋線的使用,法則曲線應用

目錄 引出畫壓縮彈簧畫等距部分畫兩端的壓縮部分曲線縫合和掃掠封閉曲面得實體 總結異形彈簧新建幾何體草圖編輯&#xff0c;畫一條樣條線進行掃掠&#xff0c;圓心和半徑畫出曲面上的螺旋線再次選擇掃掠&#xff0c;圓心和半徑 其他自定義信號和槽1.自定義信號2.自定義槽3.建立…