詳解 Java 泛型:核心概念與實用示例

詳解 Java 泛型:核心概念與實用示例

Java 泛型(Generics)是Java SE 5引入的一項特性,旨在提高代碼的可重用性和類型安全性。通過泛型,開發者可以編寫一個通用的類、接口或方法,可以與多種類型一起工作,而不需要為每種類型創建不同的版本。

泛型的核心概念

泛型類(Generic Class)
泛型類是包含一個或多個類型參數的類。例如:

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

這里,T 是類型參數,可以在創建 Box 對象時指定具體的類型:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);

泛型方法(Generic Method):

泛型方法是包含類型參數的方法。類型參數在方法的聲明中被指定。例如:

public class GenericMethodExample {public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3, 4};String[] stringArray = {"A", "B", "C"};printArray(intArray);printArray(stringArray);}
}

泛型接口(Generic Interface):

泛型接口和泛型類類似。它們允許類型參數在接口中使用。例如:

public interface Pair<K, V> {K getKey();V getValue();
}public class OrderedPair<K, V> implements Pair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }
}

類型通配符(Wildcard):

泛型中的通配符用于表示未知類型。通配符有三種形式:

  • 無限制通配符(?):表示任何類型。
public void printList(List<?> list) {for (Object elem : list) {System.out.println(elem);}
}
  • 有上限的通配符(? extends Type):表示類型是 Type 或其子類。
public void processList(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
  • 有下限的通配符(? super Type):表示類型是 Type 或其父類。
public void addNumber(List<? super Integer> list) {list.add(new Integer(123));
}

類型擦除(Type Erasure):

泛型在編譯時會進行類型擦除,這意味著泛型類型在運行時被移除,并替換為其限定類型(如果未指定,則為 Object)。這使得泛型可以與非泛型代碼互操作。

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

編譯后:

public class Box {private Object content;public void setContent(Object content) {this.content = content;}public Object getContent() {return content;}
}

使用泛型的注意事項

不能創建泛型類型的實例

public class Box<T> {// T t = new T(); // 錯誤:不能直接創建泛型類型的實例
}

靜態成員不能使用類型參數

public class Box<T> {// private static T content; // 錯誤:靜態變量不能使用類型參數
}

泛型數組創建受限

public class Box<T> {// T[] array = new T[10]; // 錯誤:不能直接創建泛型數組
}

示例:使用泛型的棧

public class GenericStack<T> {private List<T> stack = new ArrayList<>();public void push(T element) {stack.add(element);}public T pop() {if (!stack.isEmpty()) {return stack.remove(stack.size() - 1);}return null;}public boolean isEmpty() {return stack.isEmpty();}public static void main(String[] args) {GenericStack<String> stringStack = new GenericStack<>();stringStack.push("Hello");stringStack.push("World");System.out.println(stringStack.pop()); // 輸出:WorldGenericStack<Integer> intStack = new GenericStack<>();intStack.push(1);intStack.push(2);System.out.println(intStack.pop()); // 輸出:2}
}

結論

Java 泛型提供了一種類型安全的方式來實現通用編程。它們不僅提高了代碼的可讀性和可維護性,還避免了類型轉換的錯誤。在編寫通用類、接口和方法時,泛型是一個強大的工具。

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

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

相關文章

汽車電子學習【車載網絡CAN/LIN】

車載網絡CAN/LIN知識總結 STM32F1開發板測試 STM32測試程序 /** CAN 通信報文內容設置*/ void CAN_SetMsg(void) { #if CAN_STDTxMessage.StdId 0x12;TxMessage.IDE CAN_ID_STD; #elseTxMessage.ExtId 0x1314; //使用的擴展IDTxMessage.IDE CAN_ID_EXT; //擴展模式 #…

C++進程間通信 消息隊列

C進程間通信 消息隊列 消息隊列概述消息隊列代碼示例1. 創建和發送消息的程序&#xff08;sender.cpp&#xff09;2. 接收消息的程序&#xff08;receiver.cpp&#xff09; 代碼解釋運行步驟運行結果 消息隊列概述 消息隊列是一種進程間通信機制&#xff0c;允許一個或多個進程…

Django 做migrations時出錯,解決方案

在做migrations的時候&#xff0c;偶爾會出現出錯。 在已有數據的表中新增字段時&#xff0c;會彈出下面的信息 運行這個命令時 python manage.py makemigrationsTracking file by folder pattern: migrations It is impossible to add a non-nullable field ‘example’ to …

Linux---網絡相關配置

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 前言 一臺主機需要配置必要的網絡信息&#xff0c;才可以連接到互聯網&#xff0c;需要的配置網絡信息包括IP&#xff0c;子網掩碼&#xff0c;網關和DNS。 一.查看網絡信息 查看IP信息可以通…

echarts高級應用

目錄 一、顯示相關 1.1、主題 1.1.1、內置主題 1.1.2、自定義主題 1.2、調色盤和顏色漸變 1.2.1、主題調色盤<全局調色盤<局部調色盤 1.2.2、線性漸變(linear)、徑向漸變(radial) 1.3、直接樣式和高亮樣式 1.3.1、直接樣式 1.3.2、高亮樣式 1.4、圖表自適應 …

Fine-tuning和模型訓練的關系

概述 Fine-tuning和模型訓練不是完全相同的概念&#xff0c;但它們之間有密切的關系&#xff0c;都是機器學習和深度學習過程中的重要步驟。 模型訓練是一個更廣泛的概念&#xff0c;指的是使用數據去調整模型的內部參數&#xff0c;以使得模型能夠從輸入數據中學習并做出預測…

軟件架構設計屬性之三:結構性屬性淺析

文章目錄 引言一、結構性屬性的定義二、結構性屬性的關鍵要素1. 組件化2. 模塊化3. 層次化4. 接口定義5. 數據流6. 依賴管理 三、結構性屬性的設計原則1. 高內聚低耦合2. 松耦合3. 清晰的接口4. 可維護性5. 可擴展性 四、結構性屬性的實現策略1. 組件劃分2. 模塊化設計3. 接口設…

【AREngine BUG 解決方法】無法獲取有效的相機圖像尺寸

近期拿了一臺 華為mate20 Pro的手機&#xff0c;在運行AR示例的過程中出現了黑屏。 問題排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 經排查&#xff0c;發現(ARCamera對象的相機內參) getImageDimensions()返回的圖像尺寸的width和height都為0。 這…

Kong api網關實戰教程

1. kong介紹 Kong是一款基于OpenResty(NginxLua模塊)編寫的高可用、易擴展的&#xff0c;由Mashape公司開源的API Gateway項目。Kong是基于NGINX和Apache Cassandra或PostgresQL構建的&#xff0c;能據供易于使用的RSTTAP[來操作和配置API管理系統&#xff0c;所以它可以水平擴…

【上】王樹森《小紅書推薦系統公開課》- 課程筆記(推薦系統基礎、召回、排序)

寫在前面 本文為王樹森老師《小紅書推薦系統公開課》的課程筆記 課程來源&#xff1a;ShusenWang的個人空間-ShusenWang個人主頁-嗶哩嗶哩視頻 (bilibili.com)課程資料&#xff1a;GitHub - wangshusen/RecommenderSystem 由于篇幅較長&#xff0c;分為【上】【下】兩篇文章…

C#中的比較和邏輯運算符

在C#編程中&#xff0c;比較和邏輯運算符是控制程序流程和執行條件判斷的重要工具。以下是C#中一些常用的比較和邏輯運算符及其示例。 相等運算符 運算符用于比較兩個值是否相等。如果相等&#xff0c;返回 true&#xff1b;否則返回 false。 示例 int a 5, b 5; bool is…

【busybox記錄】【shell指令】unlink

目錄 內容來源&#xff1a; 【GUN】【unlink】指令介紹 【busybox】【unlink】指令介紹 【linux】【unlink】指令介紹 使用示例&#xff1a; 刪除文件 - 默認 常用組合指令&#xff1a; 指令不常用/組合用法還需繼續挖掘&#xff1a; 內容來源&#xff1a; GUN &#x…

深入解析Web前端三大主流框架:Angular、React和Vue

Web前端三大主流框架分別是Angular、React和Vue。下面我將為您詳細介紹這三大框架的特點和使用指南。 Angular 核心概念: 組件(Components): 組件是Angular應用的構建塊,每個組件由一個帶有裝飾器的類、一個HTML模板、一個CSS樣式表組成。組件通過輸入(@Input)和輸出(…

【OrangePi AIpro】開箱初體驗以及OAK深度相機測試

1. 簡介 Orangepi AIPRO 是一款采用昇騰AI技術路線&#xff0c;集成4核64位處理器AI處理器的單板計算機&#xff0c;集成圖形處理器&#xff0c;支持8TOPS AI算力&#xff0c;擁有8GB/16GB LPDDR4X&#xff0c;可以外接eMMC模塊&#xff0c;支持雙4K高清輸出。 Orange Pi AIpr…

VirtualDisplay圖像數據流trace分析

1. 計算器App更新圖像幀&#xff08;QueuedBuffer - ViewRootImpl[Calculator]#0BLAST#0&#xff09;&#xff0c;調用eglSwapBuffersWithDamageKHR&#xff0c;然后queueBuffer向surfaceflinger提交圖像buffer 2. sf調用latchBuffer獲取buffer&#xff0c;進行一些狀態的處理…

CBK-D2-安全與架構工程.md

CBK-D2-安全與架構工程 密碼學和對稱密鑰算法 密碼通信的基礎知識 明文P-plaintext、加密encrypt、密文C-ciphertext、解密decrypt、密鑰Key 多數情況下,密鑰無非是一個極大的二進制數 每一種算法都有一個特定密鑰控制key space,是一個特定的數值范圍 密鑰空間由位大小b…

數字圖像處理系列 | 線性濾波(高斯濾波)(3)

我們知道了什么是 線性平移不變系統是在做卷積操作 之后&#xff0c;我們發展出了一些非常簡單的 線性濾波&#xff0c; 去增強圖片&#xff0c;提取圖片特征 文章目錄 1. 卷積如何在離散圖片中工作的Vis 原圖和mask做卷積時發生了什么首先&#xff0c;如何得到 (i.j)位置的卷積…

操作系統中的內存管理

虛擬內存 操作系統會提供一種機制&#xff0c;將不同進程的虛擬地址和不同內存的物理地址映射起來。如果程序要訪問虛擬地址的時候&#xff0c;由操作系統轉換成不同的物理地址&#xff0c;這樣不同的進程運行的時候&#xff0c;寫入的是不同的物理地址&#xff0c;這樣就不會沖…

Python 技能提升(一)

python注釋規范 # Add commit for you codes. # The proper addition of comments is so beautiful.from abc import abstractmethoddef add(a: int, b: int) -> int:# You can write some necessary notes here.# Such as the role of functions, the types and roles of …

Slurm集群使用基礎

Introduction 我們在做生物信息分析時&#xff0c;對于大規模的上游數據的處理&#xff0c;一般需要在大型服務器或集群上進行。我最早接觸并使用的是一個基于SLURM調度系統的集群&#xff0c;在此記錄一下基礎使用方法。 高性能計算集群&#xff08;High-Performance Comput…