【Java學習筆記】泛型

泛型

一、泛型的引出

代碼示例

public class pra {public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add("java");arrayList.add("jack");arrayList.add("jom");arrayList.add(new a());for (Object obj :arrayList) {String str = (String)obj;System.out.println(str);}}
}class a{public a() {}
}

由于添加了 a 對象,但是在遍歷的時候遍歷的是字符串對象,這個時候就會拋出ClassCastException異常

問題總結

總結:由于集合中添加的對象,當集合中的對象不為同一類對象時,遍歷集合就會出現異常,這個時候可以通過泛型來約束集合存儲的對象類型


二、泛型

1. 基本介紹

(1)泛型又稱參數化類型,是 Jdk5.0 出現的新特性,解決數據類型的安全性問題

(2)在類聲明或實例化時只要指定好需要的具體的類型即可。

(3)Java 泛型可以保證如果程序在編譯時沒有發出警告,運行時就不會產生 ClassCastException 異常。同時,代碼更加簡潔、健壯

(4)泛型的作用是:可以在類聲明時通過一個標識表示類中某個屬性的類型,或者是某個方法的返回值的類型,或者是參數類型。

(5)泛型的理解:是一種表示數據類型的數據類型

2. 泛型的使用

(1)基本語法

單例集合

ArrayList<T> arrylist = new ArrayList<T>()

雙例集合

HashMap<K,V> arrylist = new HashMap<K,V>()

推薦寫法

ArrayList<String> arrylist = new ArrayList<>()

說明:T、K、V 不代表值(可以替換成其他任意字母),而是表示類型

(2)應用場景

1. 接口

interface 接口名<T>{}

2. 類

class<K,T....>{}

注意:類中可以有多個泛型變量

3. 泛型的優點

4. 泛型的使用細節

ArrayList list = new ArrayList();ArrayList<Object> list = new ArrayList<>()

傳入子類型的說明

public class pra {public static void main(String[] args) {animal<a> a = new animal<a>(new a());animal<a> b = new animal<a>(new b());}
}class a{}class b extends a{}class animal<T>{T e;// 構造器public animal(T e){this.e = e;}public void getclass(){System.out.println(e.getClass());}
}

說明:指定了animal類只能存儲 a 類對象,但是 b 類是 a 的子類,即 animal 類既可以是 a 對象也可以是 b 對象

5. 簡單的泛型案例

public class pra {public static void main(String[] args) {HashMap<String,student> hashMap = new HashMap<>();hashMap.put("18",new student("jackson"));hashMap.put("20",new student("jack"));hashMap.put("23",new student("jom"));// 先取出entrysetSet<Map.Entry<String, student>> entries = hashMap.entrySet();// 構建迭代器(指向單例集合)Iterator<Map.Entry<String, student>> iterator = entries.iterator();while (iterator.hasNext()) {Map.Entry<String, student> next = iterator.next();System.out.println("key:" + next.getKey() + " value:" + next.getValue());}}
}class student{String name;public student(String name) {this.name = name;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +'}';}
}

通過指定 HashMap 存儲鍵值對的類型,然后遍歷集合查看存儲結果


三、自定義泛型類

1. 基本介紹

(1) 普通成員可以使用泛型(屬性、方法)

(2) 使用泛型的數組,不能初始化(由于不知道數組的類型,無法在內存開辟空間)

(3) 靜態方法中不能使用類的泛型

(4) 泛型類的類型,是在創建對象時確定的(因為創建對象時,需要指定確定類型)

(5) 如果在創建對象時,沒有指定類型,默認為 Object

(6)泛型是標識符,需要大寫

結構示例

class a<T,K,V...>{T age;K name;V phone_number;...
}

四、自定義泛型接口

(1) 接口中,靜態成員也不能使用泛型

(2) 泛型接口的類型,在繼承接口或者實現接口時確定

(3) 沒有指定類型,默認為 Object

(4)如果一個類實現了泛型接口,需要實現接口中的方法并且需要指定接口方法中的泛型類型

代碼示例

public class pra {public static void main(String[] args) {}
}interface a<T,R>{// 接口中的變量默認是靜態的,需要賦初值void hi(T t,R r);void pay(T t,R r);void run(T t,R r);
}class b implements a<String,Double>{@Overridepublic void hi(String s, Double aDouble) {}@Overridepublic void pay(String s, Double aDouble) {}@Overridepublic void run(String s, Double aDouble) {}
}

代碼分析

通過指定泛型的類型來實現接口中的方法


五、自定義泛型方法

(1)實體信息為泛型方法的定義位置相關內容,泛型方法可定義在普通類或泛型類中

(2)泛型方法調用時確定類型(通過傳入的參數自動判斷是什么類型)

(3)若修飾符后無 <T,R...> ,像 public void eat(E e) {} 不是泛型方法,只是方法參數使用了泛型


六、泛型的繼承和通配符

(1)泛型不具備繼承性(錯誤案例:List<Object> list = new ArrayList<String>()

(2) <?> : 支持任意泛型類型

(3) <? extends A> : 支持 A 類以及 A 類的子類,規定了泛型的上限

(4) <? super A> : 支持 A 類以及 A 類的父類,不限于直接父類,規定了泛型的下限

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

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

相關文章

SpringMVC系列(一)(介紹,簡單應用以及路徑位置通配符)

0 引言 作者正在學習SpringMVC相關內容&#xff0c;學到了一些知識&#xff0c;希望分享給需要短時間想要了解SpringMVC的讀者朋友們&#xff0c;想用通俗的語言講述其中的知識&#xff0c;希望與諸位共勉&#xff0c;共同進步&#xff01; 1 SpringMVC介紹 SpringMVC本質上…

Java中如何使用lambda表達式分類groupby

Java中如何使用lambda表達式分類groupby Java中如何使用lambda表達式分類groupby分類問題場景傳統手寫方式lambda使用groupBy()方法一行結束&#xff01;&#xff01;&#xff01;完整代碼 Java中如何使用lambda表達式分類groupby 分類問題場景 比如一群學生根據性別和年齡排…

無人機開發分享——無人機集群基于braft實現長機動態推選算法

在無人機集群項目的算法開發中&#xff0c;推選長機作為集群的動態中心&#xff0c;往往承擔著集群管理、通訊中繼等重要功能。由于通訊鏈路的有限性和任務的實時性需要&#xff0c;需要保證動態長機時刻工作正常&#xff0c;并在異常情況下快速切換新長機。 本文主要分享基于b…

python 解碼 jwt

import base64 import jsondef base64url_decode(base64url_data):# 將URL安全的base64編碼數據轉換為標準的base64編碼數據base64_data base64url_data.replace(-, ).replace(_, /)# 如果數據長度不是4的倍數&#xff0c;則補齊padding_length 4 - len(base64_data) % 4base…

騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(MySQL版)

數據庫交付運維工程師-騰訊云TDSQL(MySQL版)認證 適合人群&#xff1a; 適合從事TDSQL(MySQL版)交付、初級運維、售前咨詢以及TDSQL相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考試 查詢 考試費用&am…

Spring Boot的Security安全控制——認識SpringSecurity!

Spring Boot的Security安全控制 在Web項目開發中&#xff0c;安全控制是非常重要的&#xff0c;不同的人配置不同的權限&#xff0c;這樣的系統才安全。最常見的權限框架有Shiro和Spring Security。Shiro偏向于權限控制&#xff0c;而Spring Security能實現權限控制和安全控制…

深入理解ArrayList:從Java原生實現到手寫一個ArrayList

Java原生ArrayList解析 基本結構 Java的ArrayList是基于數組實現的動態列表&#xff0c;主要特點包括&#xff1a; 動態擴容&#xff1a;當元素數量超過當前容量時&#xff0c;自動擴容&#xff08;通常增加50%&#xff09; 快速隨機訪問&#xff1a;通過索引訪問元素的時間…

【力扣 簡單 C】206. 反轉鏈表

目錄 題目 解法一&#xff1a;迭代 解法二&#xff1a;遞歸 題目 解法一&#xff1a;迭代 struct ListNode* reverse(struct ListNode* head) {struct ListNode* retHead NULL;while (head){struct ListNode* nextNode head->next;head->next retHead;retHead he…

明代大模型:智能重構下的文明再發現

引言&#xff1a;當紫禁城遇見生成式AI 一幅動態的《紫禁城圖卷》正通過全息投影技術演繹永樂年間的宮廷盛景。這個虛實交融的場景&#xff0c;恰似明代大模型技術的隱喻——以人工智能為紐帶&#xff0c;連接起永樂盛世的恢弘氣象與數字時代的文明重構。作為人工智能與歷史學…

推薦使用的Unity插件(行為樹Behavior )

在 Unity 6.0 中使用 Behavior Designer 行為樹插件開發 AI 系統&#xff0c;需結合其核心節點設計、變量管理和代碼控制。以下是詳細指南&#xff0c;整合了最新版本的最佳實踐&#xff1a; &#x1f6e0;? 1. 安裝與基礎配置 安裝插件 通過 Unity Asset Store 安裝 “Behav…

107. Java 繼承 - 總結:方法重寫與隱藏

文章目錄 107. Java 繼承 - 總結&#xff1a;方法重寫與隱藏**詳細解釋&#xff1a;****方法重載** **總結** 107. Java 繼承 - 總結&#xff1a;方法重寫與隱藏 在 Java 中&#xff0c;定義與超類中的方法具有相同簽名的方法時&#xff0c;不同類型的方法之間會有不同的行為。…

Spring Cloud使用Eureka調用接口,超時設置(二)

在 Spring Cloud 微服務架構中&#xff0c;當同時配置了 Ribbon 和 Feign 的超時時間時&#xff0c;Feign 的配置優先級高于 Ribbon。具體規則和底層邏輯如下&#xff1a; ?? 1. 配置優先級規則 Feign 顯式配置 > Ribbon 配置 若在 Feign 中顯式設置了超時時間&#xff0…

iOS-SM3加密算法N種集成

近期的一個項目需要用到SM3加密算法&#xff0c;需要在iOS中使用Objective-C實現SM3國密加密算法。 SM3&#xff1a;是中國國家密碼管理局發布的密碼雜湊算法標準&#xff0c;適用于商用密碼應用中的數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成等 由于iOS系統并未…

[逆向工程]什么是TEB 與 PEB(二十九)

[逆向工程]什么是TEB 與 PEB(二十九) 一、引言:為什么需要了解 TEB/PEB? 在 Windows 系統開發、調試或逆向工程中,TEB(Thread Environment Block) 和 PEB(Process Environment Block) 是理解程序執行機制的關鍵。它們如同進程與線程的“身份證”,存儲了從內存布局到…

逆向分析貝殼網人機驗證JS加密邏輯

引言 在數據爬取和自動化測試過程中&#xff0c;人機驗證&#xff08;如滑塊、點選、短信驗證等&#xff09;是常見的反爬手段。貝殼網&#xff08;ke.com&#xff09;作為國內領先的房產平臺&#xff0c;其人機驗證機制較為復雜&#xff0c;涉及前端JS加密、動態Token、行為檢…

Vue3 + Element Plus中el-table加載狀態分析

在 Vue 3 中&#xff0c;當 onMounted 鉤子被觸發時&#xff0c;父組件的 DOM 已經掛載完成&#xff0c;但子組件&#xff08;如 el-table&#xff09;可能尚未完成其內部渲染。具體分析如下&#xff1a; 1. onMounted 的執行時機 父組件掛載完成&#xff1a;onMounted 表示當前…

OpenCV圖像拼接技術詳解:從特征匹配到全景合成

本文將詳細介紹如何使用OpenCV實現兩幅圖像的自動拼接&#xff0c;涵蓋特征提取、單應性矩陣計算和圖像融合等關鍵技術。 一、圖像拼接概述 圖像拼接是將多張有重疊區域的圖像合并成一幅全景圖的技術&#xff0c;廣泛應用于全景攝影、衛星圖像處理、醫學影像等領域。其核心技術…

如何通過 5 種方式向 Android 手機添加音樂

想把音樂添加到你的安卓手機&#xff0c;然后隨時隨地無需網絡連接就能欣賞你喜愛的音樂嗎&#xff1f;這不再是麻煩。現在&#xff0c;你可以按照本指南中的有效方法&#xff0c;將音樂添加到你的安卓手機上。讓我們在安卓手機上聆聽我們美妙的歌曲吧。 第 1 部分&#xff1a;…

VS Code 項目中的 .vscode 目錄詳解

VS Code 項目中的 .vscode 目錄詳解 .vscode 目錄是 VS Code 項目的核心配置中心&#xff0c;它包含特定于當前項目的配置&#xff0c;這些配置覆蓋全局設置&#xff0c;確保團隊成員獲得一致的開發環境體驗。 .vscode 目錄中的核心文件 文件名作用是否應納入版本控制settin…

Ubuntu22.04安裝opengauss并配置遠程訪問、JDBC連接

內容概括 最近在研究怎么在ubuntu服務器環境下使用opengauss&#xff0c;看了下官方下載地址沒有適配ubuntu的安裝包。仔細翻了下官方文檔&#xff0c;發現安裝指南里有提供一個deb包安裝方案&#xff0c;有適配ubuntu&#xff0c;經過實踐可行&#xff0c;于是記錄下來給有需要…