Java 泛型基礎

目錄

1. 為什么使用泛型

2. 泛型的使用方式

2.1.?泛型類?

2.2.?泛型接口

?2.3.?泛型方法

3. 泛型涉及的符號

3.1. 類型通配符"?"?

3.2. 占位符 T/K/V/E

?3.3. 占位符T和通配符?的區別。

?4. 泛型不變性

?5. 泛型編譯時擦除


1. 為什么使用泛型

Java 為什么使用泛型-CSDN博客

2. 泛型的使用方式

2.1.?泛型類?

?泛型類是用類型參數定義類的一種方式。這些類型參數在聲明類變量或作為方法參數時會被具體的類型所替代。

public class Box<T> {  private T t;  public void set(T t) { this.t = t; }  public T get() { return t; }  
}

2.2.?泛型接口

泛型接口和泛型類的定義方式類似。

public interface List<E> extends Collection<E> {  // ...  
}

?2.3.?泛型方法

泛型方法是在方法定義中聲明類型參數的方法。

public static <T> T getFirst(List<T> list) {  if (list == null || list.isEmpty()) {  return null;  }  return list.get(0);  
}

3. 泛型涉及的符號

3.1. 類型通配符"?"?

如 ?、? extends T、? super T。用于表示未知的類型,或表示某個類型的子類型或超類型。

  • 無界通配符“?“:

無界通配符表示未知的類型。當使用無界通配符時,編寫時不能往這個通配符表示的集合中存放元素,但是可以從集合中獲取元素(并且只能賦值給?Object?類型的變量或是進行類型轉換)。這是因為編譯器不知道集合中元素的具體類型,所以不能確保放入的元素與集合中已有的元素類型兼容。


運行時可以賦值對象。

Class<?> clazz = Class.forName("com.mycompany.myreflect.Student");

  • ? extends T:

表示未知的類型,但它是 T 或 T 的某個子類型。
我們就叫做上界限通配符,upper bounded wildcard。
當你需要讀取集合中的元素,并且你知道元素的類型至少是?T?時,可以使用這種通配符。但是,你不能往這個集合中添加元素(除了?null),因為編譯器無法確保你要添加的元素與集合中已有的元素類型兼容。

  • ? super T:

表示未知的類型,但它是 T 或 T 的某個超類型。
?我們就叫做下界通配符, ???lower bounded wildcard。
當你需要向集合中添加元素,并且你知道這些元素的類型是?T?或其子類時,可以使用這種通配符。同時,你也可以從集合中讀取元素,但是只能賦值給?Object?類型的變量或是?T?的超類型。

3.2. 占位符 T/K/V/E

T是占位符。其實它同K/V/E是一樣的沒有任何差別。只是我們的習慣會將它用在不同地方用于區別。

public class PrinterGen<T> { 
//這個字符T,其實你可以使用你喜歡的字符代替,但是它必須和尖括號配合使用
//...
}

?3.3. 占位符T和通配符?的區別。

  • 用途:泛型主要用于定義可重用的類、接口和方法,其中類型參數在編譯時確定。通配符主要用于表示對類型的約束或限制,通常用于泛型方法或泛型類的參數
  • 類型擦除:泛型在編譯時會被類型擦除,而通配符在運行時仍然存在,用于表示對類型的約束。
  • 編譯時是否確定:如果編譯時可以確定類型的,就可以使用T。而一定要等到運行時才能確定具體類型的就需要使用?
            Class<?> clazz = Class.forName("com.mycompany.myreflect.Student");System.out.println(clazz);Class<Student> clazz = Student.class;System.out.println(clazz);
    而申明方法,類型,接口時,只能使用T,不能使用?。也是由于我們申明的方法等,在編譯時調用它的地方參數可以是不同的,但是必須是確定的。

?4. 泛型不變性

Java中的泛型不變性(Generics Invariance)主要指的是泛型類型在編譯時的類型安全性質,它確保了泛型類型在聲明和使用時類型的一致性。?

?

這是因為雖然String是Object的子類,但是List<String>并不是List<Object>的子類。

?5. 泛型編譯時擦除

Java的泛型類型信息是在編譯時被擦除的,而不是在運行時。這是Java泛型實現的一個重要特性,稱為類型擦除(Type Erasure)。

在編譯時,Java編譯器會處理泛型代碼,生成不包含泛型類型信息的字節碼。具體來說,編譯器會將泛型類型參數替換為它們的上界(通常是Object,除非明確指定了其他上界),并插入必要的類型轉換和類型檢查代碼以確保類型安全。這個過程被稱為類型擦除。

在運行時,Java虛擬機(JVM)加載并運行這些已經過類型擦除的字節碼。由于泛型類型信息已經被擦除,JVM不知道也不關心這些類型參數。它只看到普通的類和接口,以及普通的方法調用和字段訪問。

因此,雖然泛型提供了類型安全和更好的代碼可讀性,但它們并不會影響Java程序的運行時行為。泛型主要是一種編譯時的語法糖,用于提高代碼的可讀性和類型安全性,而不會增加任何運行時開銷。

源代碼

編譯后

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

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

相關文章

基于深度學習的入侵檢測系統綜述文獻概述

好長時間不發博客了&#xff0c;不是因為我擺爛了&#xff0c;是我換研究方向了&#xff0c;以后我就要搞科研了。使用博客記錄我的科研故事&#xff0c;邀諸君共同見證我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互聯網發展迅速&#xff…

Android firebase消息推送集成 FCM消息處理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一個服務&#xff0c;用于處理來自 Firebase 服務器的消息。它有幾個關鍵的方法&#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解釋這些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它們用于不同的情況,取決于你是否通過指針訪問結構體成員。

p->name&#xff1a;這是指針訪問運算符&#xff08;箭頭運算符&#xff09;。當 p 是一個指向結構體的指針時&#xff0c;用 p->name 來訪問結構體的成員。 student* p &stu; // p 是一個指向 student 類型的指針 cout << p->name << endl; // 通過…

基于ssm的蛋糕商城系統java項目jsp項目javaweb

文章目錄 蛋糕商城系統一、項目演示二、項目介紹三、系統部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 蛋糕商城系統 一、項目演示 蛋糕商城管理系統 二、項目介紹 系統角色 : 管理員、用戶 一&#xff0c;管理員 管理員有…

PICO VR眼鏡定制播放器使用說明文檔videoplayerlib-ToB.apk

安裝高級定制播放器 高級定制播放器下載地址:https://download.csdn.net/download/ahphong/89360454 僅限用于PICO G2、G3、G4、NEO系列VR眼鏡上使用, 用途:用于第三方APP(開發者)調用定制播放器播放2D、3D、180、360全景視頻。 VR眼鏡系統請升級到最新版,可在官網下載,…

Mixed-precision計算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】選擇排序以及需要注意的問題

選擇排序的基本思想&#xff1a;每一次從待排序的數據元素中選出最小&#xff08;或最大&#xff09;的一個元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的數據元素排完 。 第一種實現方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金絲雀發布后續 + 聲明式資源管理yaml

目錄 一、K8S常見的發布方式 1.1藍綠發布 1.2灰度發布&#xff08;金絲雀發布&#xff09; 1.3滾動發布 二、金絲雀發布 三、聲明式管理方法 3.1YAML 語法格式 3.1.1查看 api 資源版本標簽 3.1.2查看資源簡寫 3.2YAML文件詳解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊屬性

特殊屬性 will-change will-change 屬性用于向瀏覽器提供提示,表明某個元素或其特定屬性在未來極有可能發生變化。這有助于瀏覽器提前優化相關渲染流程,提升動畫或其他動態效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++內存管理方式

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” C/C內存分布 在這篇文章開始之前&#xff0c;我們先以一道題目來進行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java進階學習筆記27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可變字符串對象&#xff0c;相當于一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 好處&#xff1a; StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;…

在CSDN上成長的感悟,你的粉絲長啥樣?

文章目錄 一、寫作的初衷1. 記錄所學內容2.鞏固所學知識3.分享與幫助4.方便后續查找5.獲取激勵 二、你的粉絲長啥樣&#xff1f;1. 粉絲的特點與困惑2. 關于粉絲&#xff0c;細思極恐 三、繼續前行、堅持初心 在CSDN上寫博文&#xff0c;對于我來說&#xff0c;不僅僅是一個記錄…

OTA在線旅行社系統架構:連接世界的科技紐帶

隨著互聯網的快速發展和人們對旅行需求的不斷增長&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在線旅行社成為了現代旅行業中的重要一環。OTA系統架構的設計和實現將對旅行行業產生深遠影響。本文將探討OTA在線旅行社系統架構的重要性和關鍵組成部分&#xff…

異構圖上的連接預測一

這里寫目錄標題 異構圖&#xff1f;處理數據&#xff1a; 異構圖&#xff1f; 異構圖&#xff1a;就是指節點與邊類型不同的圖。 連接預測&#xff1a;目的是預測圖中兩個節點之間是否存在一條邊&#xff0c;或者是預測兩個節點之間&#xff0c;在未來可能形成的連接。 eg&…

Linux系統如何通過編譯方式安裝python3.11.3

1.切換到/data 目錄 cd /data 2.下載python源碼Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安裝路徑 和 執行openssl的路徑 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用繼承&#xff1a;2、案例2&#xff1a;final修飾的類不可以被繼承&#xff1a;3、案例3&#xff1a;final修飾的類不能有子類&#xff0c;但是可以有父類4、final修飾構造方法5、final修飾普通方法6、…

頭歌GCC編程工具集第1關:實驗工具GCC與objdump的使用

任務要求 根據提示&#xff0c;在右側編輯器中顯示的bytes.c文件中的 Begin-End 之間補充代碼&#xff08;即設置一個數組的初始值&#xff09;&#xff0c;使其與如下顯示的main.c文件一起編譯、生成的程序在運行時輸出“SUCCESS”。 程序源文件main.c的內容如下&#xff08;務…

牛客前端面試高頻八股總結(1)(附文檔)

1.html語義化 要求使用具有語義的標簽&#xff1a;header footer article aside section nav 三點好處&#xff1a; &#xff08;1&#xff09;提高代碼可讀性&#xff0c;頁面內容結構化&#xff0c;更清晰 &#xff08;2&#xff09;無css時&#xff0c;時頁面呈現出良好…

滲透工具CobaltStrike工具的下載和安裝

一、CobalStrike簡介 Cobalt Strike(簡稱為CS)是一款基于java的滲透測試工具&#xff0c;專業的團隊作戰的滲透測試工具。CS使用了C/S架構&#xff0c;它分為客戶端(Client)和服務端(Server)&#xff0c;服務端只要一個&#xff0c;客戶端可有多個&#xff0c;多人連接服務端后…

Golang設計模式(四):觀察者模式

觀察者模式 什么是觀察者 觀察者模式(Observer Pattern)&#xff1a;定義對象之間的一種一對多依賴關系&#xff0c;使得每當一個對象狀態發生改變時&#xff0c;其相關依賴對象皆得到通知并被自動更新。觀察者模式的別名包括發布-訂閱&#xff08;Publish/Subscribe&#xf…