Java-泛型類

一、泛型類的基本概念

1. 什么是泛型類

泛型類是指使用類型參數定義的類,可以在類定義時不指定具體類型,而在實例化時指定。

2. 泛型類的作用

  • 類型安全:編譯時檢查類型匹配

  • 消除強制轉換:減少運行時ClassCastException風險

  • 代碼復用:同一套邏輯可適用于多種類型

  • 提高可讀性:代碼意圖更明確

二、泛型類的基本語法

1. 定義泛型類

// T是類型參數,可以是任何非關鍵字標識符
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

2. 使用泛型類

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String str = stringBox.getContent(); // 不需要強制轉換Box<Integer> intBox = new Box<>();
intBox.setContent(123);
int num = intBox.getContent(); // 自動拆箱

三、泛型類的多類型參數

public class Pair<K, V> {private K key;private V value;public Pair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }public void setKey(K key) { this.key = key; }public void setValue(V value) { this.value = value; }
}// 使用示例
Pair<String, Integer> pair = new Pair<>("Age", 25);
String key = pair.getKey();
int value = pair.getValue();

四、泛型類的類型邊界

1. 上界通配符(extends)


public class NumberBox<T extends Number> {private T number;public double getDoubleValue() {return number.doubleValue(); // 可以調用Number的方法}
}// 只能使用Number及其子類
NumberBox<Integer> intBox = new NumberBox<>();
NumberBox<Double> doubleBox = new NumberBox<>();
// NumberBox<String> stringBox = new NumberBox<>(); // 編譯錯誤

2. 多重邊界


public class MultiBound<T extends Number & Comparable<T> & Serializable> {// T必須是Number的子類,且實現了Comparable和Serializable
}

五、泛型類的繼承關系

1. 泛型類可以繼承非泛型類

public class GenericChild<T> extends NonGenericParent {// ...
}

2. 泛型類可以繼承泛型類

public class Child<T> extends Parent<T> {// 使用相同的類型參數
}public class StringChild extends Parent<String> {// 指定具體類型
}

六、泛型類與靜態成員

public class StaticGeneric<T> {// 靜態成員不能使用類的類型參數// private static T staticField; // 編譯錯誤// 靜態方法可以定義自己的類型參數public static <E> E staticMethod(E input) {return input;}
}

七、泛型類的類型擦除

Java泛型是通過類型擦除實現的,編譯后會去除類型參數信息:

// 編譯前
Box<String> box = new Box<>();
box.setContent("Hello");// 編譯后(近似)
Box box = new Box();
box.setContent((Object)"Hello");
String str = (String)box.getContent();

八、泛型類的高級用法

1. 通配符(?)


public void processList(List<?> list) {// 可以接受任何類型的Listfor (Object item : list) {System.out.println(item);}
}public void processNumberList(List<? extends Number> list) {// 接受Number及其子類的Listfor (Number num : list) {System.out.println(num.doubleValue());}
}

2. PECS原則(Producer-Extends, Consumer-Super)

// 生產者使用extends
public void copyFrom(List<? extends Number> src, List<? super Number> dest) {for (Number num : src) {dest.add(num);}
}

九、泛型類的限制

  1. 不能創建泛型數組

    // T[] array = new T[10]; // 編譯錯誤
  2. 不能實例化類型參數

    // T obj = new T(); // 編譯錯誤
  3. 不能用于靜態上下文

    // private static T staticField; // 編譯錯誤
  4. 基本類型不能作為類型參數

    // List<int> list = new ArrayList<>(); // 編譯錯誤
    // 必須使用包裝類
    List<Integer> list = new ArrayList<>();

十、泛型類的實際應用

1. 集合框架

List<String> strings = new ArrayList<>();
Map<Integer, String> map = new HashMap<>();

2. 自定義容器

public class Cache<T> {private Map<String, T> cacheMap = new HashMap<>();public void put(String key, T value) {cacheMap.put(key, value);}public T get(String key) {return cacheMap.get(key);}
}

3. 工具類

public class MathUtils {public static <T extends Number> double average(Collection<T> numbers) {double sum = 0.0;for (T num : numbers) {sum += num.doubleValue();}return sum / numbers.size();}
}

十一、總結

Java泛型類的主要特點:

  • 通過類型參數實現通用編程

  • 提供編譯時類型安全檢查

  • 消除強制類型轉換

  • 支持類型邊界限制

  • 通過類型擦除實現

合理使用泛型類可以:

  • 提高代碼的類型安全性

  • 增強代碼的可讀性和可維護性

  • 減少重復代碼

  • 構建更靈活的API

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

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

相關文章

信任邊界的人生智慧

我曾經是個喜歡試探的人 總想知道朋友會不會在我困難時伸手&#xff0c;合作伙伴會不會在利益面前變臉&#xff0c;愛人會不會在誘惑下堅守 結果發現&#xff0c;每一次試探都像是在關系上撒鹽 不是因為對方經不起考驗&#xff0c;而是「考驗」這個行為本身就充滿了不信任的…

SQL Server 中 GO 的作用

CREATE DATABASE MyDatabase; USE MyDatabase; GO --定義局部變量 DECLARE s_no varchar(8), s_avgrade numeric(4,1); --對局部變量賦值 SET s_no 20170208; SET s_avgrade 95.0; --使用局部變量 UPDATE student SET s_avgrade s_avgrade WHERE s_no s_no;&#x1f31f; G…

指標中臺+大模型:解密衡石Agentic BI的NL2DSL架構實現

——Text2Metrics引擎如何攻克語義鴻溝&#xff0c;碾壓傳統NL2SQL方案 一、傳統NL2SQL的“架構原罪”&#xff1a;業務語義的失控黑洞 當某銀行嘗試用NL2SQL分析“高凈值客戶流失率”時&#xff0c;系統生成如下危險SQL&#xff1a; 這正是NL2SQL的三大架構缺陷&#xff1a;…

設計模式 - 抽象工廠

抽象工廠是對工廠的抽象化&#xff0c;而不只是制造方法。 為了滿足不同用戶對產品的多樣化需求&#xff0c;工廠不會只局限于生產一類產品&#xff0c;但是系統如果按工廠方法那樣為每種產品都增加一個工廠又會造成工廠泛濫。所以&#xff0c;為了調和這種矛盾&#xff0c;抽…

面向對象Plus(2/2)

目錄 面向對象Plus(qianwen) 一.面向對象三大特性 封裝 繼承 多態 二.多態 1.了解多態 2.體驗多態 三.類屬性和實例屬性 1.類屬性 a.設置和訪問類屬性 類屬性的優點 b.修改類屬性 四.類方法和靜態方法 1.類方法 a.類方法特點 b.類方法應用場景 2.靜態方法 a…

MocapApi 中文文檔 和github下載地址 NeuronDataReader(以下簡稱 NDR)的下一代編程接口

以下是 MocapApi 技術文檔 github https://github.com/pnmocap/MocapApi?tabreadme-ov-file 國內可以查找getcode 英文文檔 https://mocap-api.noitom.com/mocap_api_en.html 概述 MocapApi 是 NeuronDataReader&#xff08;以下簡稱 NDR&#xff09;的下一代編程接口&…

STM32歷史、命名、Flash、工作頻率

目錄 命名: Flash: 工作頻率&#xff1a; 復位&#xff1a; 低功耗模式&#xff1a; IO端口&#xff1a; JATG: 看門狗定時器&#xff1a; STM是一家半導體公式&#xff0c;專門做芯片的&#xff0c;STM32是指32位的微處理器&#xff0c;其中芯片的架構是ARM結構的&#…

了解公共部門中的數據網格:支柱、架構和示例

作者&#xff1a;來自 Elastic Elastic Platform Team 想想那些像公共健康記錄、城市規劃模型等項目背后的所有數據。政府機構一直在產生大量數據。當數據分散在云平臺、本地系統或像衛星和應急響應中心這樣的專業環境中時&#xff0c;情況變得更加復雜。找到信息變得困難&…

阿里云ACP-檢索分析服務

當數據量爆炸增長&#xff0c;并且需要提供全文檢索功能&#xff0c;需要有效的數據檢索能力 用什么數據庫怎么保證安全性如何解決統計分析問題如何解決單點故障如何解決檢索難題 應對方案&#xff1a; 關系型數據庫&#xff1a;主從備份解決數據安全性問題&#xff0c;數據…

【DBeaver】跨平臺數據庫連接工具DBeaver Community 23.2.5安裝配置使用

DBeaver是一款免費開源的通用數據庫管理工具和SQL客戶端&#xff0c;支持多種數據庫系統。它基于Java開發&#xff0c;具備跨平臺能力&#xff0c;可以在Windows、macOS和Linux系統上運行。 目錄 安裝DBeaver 連接MySQL數據庫 安裝DBeaver 進入DBeaver官網 DBeaver Communit…

【錢包】WEB3錢包APP框架的設計

【錢包】WEB3錢包APP框架的設計 一、前言 前段時間&#xff0c;自己做了一款WEB3錢包APP&#xff0c;從產品設計到框架搭建都是我一個人搞的&#xff0c;更多的參考了其他公司的錢包APP。 在此&#xff0c;想把自己的錢包經驗分享出來&#xff0c;幫助沒有做過錢包APP的同學開…

openGL學習(基本窗口)

學習路線 學習 OpenGL 需要掌握一系列基礎知識和技能&#xff0c;這些內容涵蓋了計算機圖形學的基本概念、編程語言、數學知識以及 OpenGL 的具體 API 使用。以下是學習 OpenGL 所需的主要知識點&#xff1a; 1. 計算機圖形學基礎 圖形學概念&#xff1a;了解圖形學的基本概…

無人機防護裝置技術解析

一、技術要點 1. 偵測防御系統 多頻譜復合探測 整合無線電偵測&#xff08;20MHz–6GHz頻段掃描&#xff09;、雷達探測、光電跟蹤&#xff08;可見光/紅外/激光&#xff09;技術&#xff0c;實現360無死角監測。例如神州明達系統可5公里內識別無人機信號&#xff0c;并同步…

2.2.2、CAN總線-測試模式、工作模式

目錄 1、測試模式 2、工作模式 &#xff08;1&#xff09; &#xff08;2&#xff09;SLEEP位&#xff1a; &#xff08;3&#xff09;INRQ位&#xff1a;&#xff08;Init Request&#xff09; &#xff08;4&#xff09;ACK&#xff1a;應答 &#xff08;5&#xff09;…

區塊鏈大講堂 | 分布式隱私計算友好的零知識證明協議

區塊鏈大講堂 主講人&#xff1a;上海交通大學計算機學院助理教授胡云聰 報告題目&#xff1a;分布式隱私計算友好的零知識證明協議 參與方式&#xff1a;掃描海報二維碼報名參與活動

MyBatis映射文件(XML)中參數傳遞和SQL特殊字符處理

1. 參數占位符 1.1 #{} 和 ${} 的區別 #{} 占位符 作用&#xff1a;安全傳參。MyBatis在執行SQL時&#xff0c;會把#{}替換成?&#xff0c;然后用參數值自動填充。 優點&#xff1a;可以防止SQL注入&#xff0c;推薦使用。 例子&#xff1a; select * from user wher…

C語言 數據結構 --排序 (直接插入排序,選擇排序,交換排序......)

引言&#xff1a;本章簡潔的講解一下數據結構中的幾個常見的排序 &#xff0c;作復習之用&#xff0c;后面可能會補一些其他的排序 。并給出一些小編學習中遇到的坑&#xff0c;作借鑒。 1.直接插入排序 直接插入排序是一種簡單直觀的排序算法&#xff0c;其基本思想是將一個數…

華為云發布盤古大模型 5.5 新一代昇騰 AI 云服務上線

2025 年 6 月 20 日&#xff0c;華為開發者大會 2025&#xff08;HDC 2025&#xff09;在東莞召開。華為常務董事、云計算 CEO 張平安宣布基于 CloudMatrix 384 超節點的新一代昇騰 AI 云服務全面上線&#xff0c;并發布盤古大模型 5.5&#xff0c;五大基礎模型實現技術突破&am…

Reactor Handle

handle 是 Reactor 中一個非常靈活的操作符&#xff0c;它允許你對每個源元素進行處理&#xff0c;并可以選擇性地發出零個或多個元素。它既可以用于映射&#xff08;map&#xff09;也可以用于過濾&#xff08;filter&#xff09;&#xff0c;因此可以看作是 map 和 filter 的…

C#哈希加密:原理、實現與應用

C#哈希加密&#xff1a;原理、實現與應用 在當今數字化時代&#xff0c;數據安全是每個應用程序都必須重視的問題。哈希加密作為一種重要的加密技術&#xff0c;在密碼存儲、數據完整性驗證、數字簽名等領域發揮著關鍵作用。本文將深入探討C#中哈希加密的原理、常用算法以及實…