Java 溯本求源之基礎(三十一)——泛型

目錄

1. 泛型的定義與基本概念

2. 泛型的優勢

3. 泛型的基本語法

3.1 泛型類

3.2 泛型方法

3.3 泛型接口

4. 泛型的邊界

4.1 上限通配符(? extends T)

4.2 下限通配符(? super T)

5. 泛型的類型擦除

6. 泛型的使用場景

7. 結語


1. 泛型的定義與基本概念

????????在 Java 中,泛型(Generics)是一種強大的特性,它允許在類、接口和方法中使用類型參數。通過泛型,我們可以在編譯時指定類、接口和方法的操作對象的類型,從而提高代碼的安全性和復用性。

????????簡單來說,泛型就是類型參數化。通過泛型,開發者可以編寫通用的類、接口和方法,而無需在使用時指定具體的類型,直到編譯時才決定具體類型,從而實現代碼的類型安全和靈活性。

2. 泛型的優勢
  • 類型安全:在沒有泛型的情況下,集合類(如 ListMap 等)通常只能存儲 Object 類型的元素,這就意味著你在提取元素時需要進行類型轉換,且可能會導致 ClassCastException 異常。泛型則通過參數化類型來避免這種情況,確保了類型安全。

  • 代碼復用:通過泛型,類、方法和接口可以處理不同類型的數據,避免了重復編寫相似代碼的需要。

  • 提高可讀性:使用泛型后,代碼會更具可讀性,避免了過多的強制類型轉換,代碼的意圖更加明確。

3. 泛型的基本語法
3.1 泛型類

一個泛型類的定義格式如下:

class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}

在上面的例子中,T 是類型參數,代表某個具體的類型。在創建對象時,我們可以指定類型:

Box<Integer> integerBox = new Box<>();
integerBox.setValue(10);
System.out.println(integerBox.getValue()); // 輸出:10Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
System.out.println(stringBox.getValue()); // 輸出:Hello
3.2 泛型方法

除了泛型類外,泛型還可以應用于方法中。泛型方法的定義格式如下:

public <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}
}

這里的 <T> 是方法級別的泛型,它表示方法的返回類型和參數類型是可以自定義的。例如:

public class Test {public static void main(String[] args) {Integer[] intArray = {1, 2, 3};String[] stringArray = {"Hello", "World"};printArray(intArray);  // 輸出:1 2 3printArray(stringArray);  // 輸出:Hello World}
}
3.3 泛型接口

泛型還可以應用于接口。下面是一個泛型接口的例子:

interface Pair<K, V> {K getKey();V getValue();
}class SimplePair<K, V> implements Pair<K, V> {private K key;private V value;public SimplePair(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}
}
4. 泛型的邊界

????????在泛型中,除了可以指定類型,還可以使用邊界來限制泛型的類型范圍。常見的有上限通配符和下限通配符。

4.1 上限通配符(? extends T

上限通配符用于指定某個泛型類型是指定類型或其子類。例如:

public static void printList(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
4.2 下限通配符(? super T

????????下限通配符用于指定某個泛型類型是指定類型或其父類。例如

public static void addNumbers(List<? super Integer> list) {list.add(10);list.add(20);
}

? super Integer 表示這個 list 的類型參數可以是 Integer 類型或其父類(如 NumberObject)。

5. 泛型的類型擦除

????????Java 泛型是通過類型擦除來實現的。這意味著在編譯時,Java 會將泛型的實際類型替換為原始類型(通常是 Object),因此,在運行時,無法直接獲取泛型的類型信息。

例如:

public class Test {public static void main(String[] args) {Box<Integer> intBox = new Box<>();Box<String> strBox = new Box<>();System.out.println(intBox.getClass() == strBox.getClass());  // 輸出:true}
}

盡管 intBoxstrBox 是不同類型的泛型對象,但它們的類類型在運行時是一樣的。

6. 泛型的使用場景

泛型在實際開發中應用廣泛,以下是一些典型的使用場景:

  1. 集合類:Java 集合框架中的大多數類(如 List, Map, Set 等)都支持泛型,用于存儲指定類型的對象。

  2. 通用工具類:泛型可以幫助開發者編寫通用的方法和類,提高代碼復用性。

  3. 設計模式:泛型在很多設計模式中也有廣泛應用,如工廠模式策略模式等,能夠增強系統的靈活性和可擴展性。

  4. 封裝返回值:一些業務屬性如果存在很多通用的返回值那么可以進行封裝,如web接口返回值中可以設置一些響應信息,以及一些狀態碼的響應

7. 結語

????????Java 中的泛型是一個非常強大的特性,它能夠幫助我們提高代碼的復用性和類型安全性,同時使得代碼更加簡潔和易讀。通過理解泛型的基本概念和應用場景,開發者可以在實際項目中更加高效地進行開發,減少冗余代碼,并增強系統的可擴展性。

掌握泛型的使用,可以讓你在開發過程中更加靈活、簡潔,并能編寫出更具通用性和可維護性的代碼。因此,對于每一位 Java 開發者來說,深入理解泛型的特性和應用非常重要。

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

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

相關文章

純 HTML+CSS+JS 實現一個炫酷的圣誕樹動畫特效

純 HTMLCSSJS 實現一個炫酷的圣誕樹動畫特效 前言 圣誕節快到了&#xff0c;今天給大家帶來一個簡單但是效果不錯的圣誕樹動畫特效。這個特效完全使用原生 HTML、CSS 和 JavaScript 實現&#xff0c;包含閃爍的星星、隨機彩燈等元素&#xff0c;非常適合節日氣氛&#xff01;…

Maven:Java項目構建與管理的利器

在Java開發領域&#xff0c;Maven無疑是一個舉足輕重的工具。它不僅簡化了項目的構建和依賴管理&#xff0c;還促進了團隊協作和持續集成。本文將深入探討Maven的核心功能、基本配置以及在實際項目中的應用。 Maven簡介 Maven是Apache基金會下的一個開源項目&#xff0c;旨在…

【ES6復習筆記】Promise對象詳解(12)

1. 什么是 Promise&#xff1f; Promise 是 JavaScript 中處理異步操作的一種機制&#xff0c;它可以讓異步操作更加容易管理和控制。Promise 對象代表一個異步操作的最終完成或失敗&#xff0c;并提供了一種方式來處理操作的結果。 2. Promise 的基本語法 Promise 對象有三…

【RAG實戰】語言模型基礎

語言模型賦予了計算機理解和生成人類語言的能力。它結合了統計學原理和深度神經網絡技術&#xff0c;通過對大量的樣本數據進行復雜的概率分布分析來學習語言結構的內在模式和相關性。具體地&#xff0c;語言模型可根據上下文中已出現的詞序列&#xff0c;使用概率推斷來預測接…

【ES6復習筆記】Map(14)

概念 Map 是 JavaScript 中的一種數據結構&#xff0c;它允許你存儲鍵值對&#xff0c;并且可以通過鍵來訪問對應的值。在本教程中&#xff0c;我們將學習如何聲明、添加、刪除、獲取和遍歷 Map 集合。 ES6 提供了 Map 數據結構。它類似于對象&#xff0c;也是鍵值對的集合。…

富芮坤FR800X系列之PWM輸出程序應用設計

文章目錄 前言1.設計背景2.簡介3.如何設計控制調光的接口呢4.硬件設計5.軟件設計5.1.軟件流程圖5.2.軟件代碼 6.小結 前言 版權歸作者所有、未經允許、請勿轉載。 讀者對象&#xff1a; 本文檔主要適用以下工程師&#xff1a; ?嵌入式系統工程師 ?單片機軟件工程師 ?IOT固…

Ftrans數據擺渡系統 搭建安全便捷跨網文件傳輸通道

一、專業數據擺渡系統對企業的意義 專業的數據擺渡系統對企業具有重要意義&#xff0c;主要體現在以下幾個方面?&#xff1a; 1、?數據安全性?&#xff1a;數據擺渡系統通過加密傳輸、訪問控制和審計日志等功能&#xff0c;確保數據在傳輸和存儲過程中的安全性。 2、?高…

EasyPoi 使用$fe:模板語法生成Word動態行

1 Maven 依賴 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version> </dependency> 2 application.yml spring:main:allow-bean-definition-over…

定義Shape:打造屬于你的獨特圖形

自定義Shape:打造屬于你的獨特圖形 在Android開發中,自定義圖形繪制是一個非常重要的技能,尤其是在需要實現復雜UI或特定設計需求時。Android提供了android.graphics.drawable.shapes包,其中包含了一些基本的形狀類,如RectShape、OvalShape等。然而,有時這些基本形狀無法…

python 滲透開發工具之SQLMapApi Server不同IP服務啟動方式處理 解決方案SqlMapApiServer外網不能訪問的情況

目錄 說在前面 什么是 SQLMapAPI 說明 sqlmapApi能干什么 sqlmapApi 服務安裝相關 kali-sqlmap存放位置 正常啟動sqlmap-api server SqlMapApi-Server 解決外網不能訪問情況 說在前面 什么是sqlmap 這個在前面已經說過了&#xff0c;如果這個不知道&#xff0c;就可以…

【基礎還得練】 KKT 條件

優秀教程-真正理解拉格朗日乘子法和 KKT 條件&#xff1a; link優秀教程-最優化(6)&#xff1a;一般約束優化問題的最優性理論&#xff1a; link KKT條件&#xff08;Karush-Kuhn-Tucker條件&#xff09;是非線性規劃中的一組必要條件&#xff0c;在某些情況下也是最優解的充分…

使用 Webpack 優雅的構建微前端應用?

Module Federation 通常譯作“模塊聯邦”&#xff0c;是 Webpack 5 新引入的一種遠程模塊動態加載、運行技術。MF 允許我們將原本單個巨大應用按我們理想的方式拆分成多個體積更小、職責更內聚的小應用形式&#xff0c;理想情況下各個應用能夠實現獨立部署、獨立開發(不同應用甚…

Boost之log日志使用

不講理論&#xff0c;直接上在程序中可用代碼&#xff1a; 一、引入Boost模塊 開發環境&#xff1a;Visual Studio 2017 Boost庫版本&#xff1a;1.68.0 安裝方式&#xff1a;Nuget 安裝命令&#xff1a; #只安裝下面幾個即可 Install-package boost -version 1.68.0 Install…

【MySQL】十四,MySQL 8.0的隱藏索引

在MySQL 8.0之前的版本中&#xff0c;索引只能直接刪除。如果刪除后發現引起了系統故障&#xff0c;又必須進行創建。當表的數據量比較大的時候&#xff0c;這樣做的代價就會非常高。 在MySQL 8.0中&#xff0c;提供了隱藏索引。如果想刪除某個索引&#xff0c;那么在實際刪除…

【ES6復習筆記】解構賦值(2)

介紹 解構賦值是一種非常方便的語法&#xff0c;可以讓我們更簡潔地從數組和對象中提取值&#xff0c;并且可以應用于很多實際開發場景中。 1. 數組的解構賦值 數組的解構賦值是按照一定模式從數組中提取值&#xff0c;然后對變量進行賦值。下面是一個例子&#xff1a; con…

爬蟲數據存儲:Redis、MySQL 與 MongoDB 的對比與實踐

爬蟲的核心任務是從網絡中提取數據&#xff0c;而存儲這些數據是流程中不可或缺的一環。根據業務需求的不同&#xff0c;存儲的選擇可能直接影響數據處理的效率和開發體驗。本文將介紹三種常用的存儲工具——Redis、MySQL 和 MongoDB&#xff0c;分析它們的特點&#xff0c;并提…

【Python】使用匿名函數Lambda解析html源碼的任意元素(Seleinium ,BeautifulSoup皆適用)

一直都發現lambda函數非常好用&#xff0c;它可以用簡潔的方式編寫小函數&#xff0c;無需寫冗長的過程就可以獲取結果。干脆利落&#xff01; 它允許我們定義一個匿名函數&#xff0c;在調用一次性的函數時非常有用。 最近整理了一些&#xff0c;lambda函數結合BeautifulSou…

Bash語言的語法

Bash語言簡介與應用 Bash&#xff08;Bourne Again SHell&#xff09;是一種Unix Shell和命令語言&#xff0c;在Linux、macOS及其他類Unix系統中被廣泛使用。作為GNU項目的一部分&#xff0c;Bash不僅是對早期Bourne Shell的增強&#xff0c;還引入了許多特性和功能&#xff…

Ingress-Nginx Annotations 指南:配置要點全方面解讀(下)

文章目錄 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…

互聯網路由架構

大家覺得有意義和幫助記得及時關注和點贊!!! 本書致力于解決實際問題&#xff0c;書中包含大量的架構圖、拓撲圖和真實場景示例&#xff0c;內容全面 且易于上手&#xff0c;是不可多得的良心之作。本書目的是使讀者成為將自有網絡集成到全球互聯網 領域的專家。 以下是筆記內…