134. Java 泛型 - 上限通配符

文章目錄

  • 134. Java 泛型 - 上限通配符 (`? extends T`)
    • **1. 什么是上限通配符 (`? extends T`)?**
    • **2. 為什么使用 `? extends T`?**
    • **3. 示例:使用 `? extends T` 進行數據讀取**
      • **? 示例 1:計算數值列表的總和**
    • **4. 注意事項:為什么不能向 `List<? extends T>` 添加元素?**
      • **? 錯誤示例**
    • **5. 適用場景**
    • **6. 結論**

134. Java 泛型 - 上限通配符 (? extends T)

在 Java 泛型中,我們可以使用上限通配符 (? extends T) 來放寬對變量的限制,使方法能夠適用于某個類型及其所有子類型。

讓我們深入了解它的概念,并通過示例加深理解。


1. 什么是上限通配符 (? extends T)?

在泛型中,我們可以使用 ? extends T 來表示“某個類 T 及其所有子類”。

  • 其中,extends 在這里不僅表示類的繼承,也可以用于接口的實現
  • 這在處理同一類層級中的不同泛型類型時非常有用。

? 語法

List<? extends Number> list;
  • list 可以接受 List<Number>List<Integer>List<Double>List<Float> 等。
  • 但是,不能向 list 中添加元素(除了 null),因為 Java 無法確定具體的子類型。

2. 為什么使用 ? extends T

假設我們需要編寫一個方法,它能夠接受 List<Integer>List<Double>List<Number>,而不需要為每個具體類型單獨編寫方法。

使用 ? extends T 可以讓方法適用于T 及其子類,避免代碼重復,增強通用性。


3. 示例:使用 ? extends T 進行數據讀取

📌 需求:編寫一個方法計算 List<Number> 及其子類(如 IntegerDouble)的總和。

? 示例 1:計算數值列表的總和

import java.util.Arrays;
import java.util.List;public class UpperBoundWildcard {public static double sumOfList(List<? extends Number> list) {double sum = 0.0;for (Number n : list) {sum += n.doubleValue(); // ? 可以安全地調用 Number 的方法}return sum;}public static void main(String[] args) {List<Integer> integers = Arrays.asList(1, 2, 3);System.out.println("Sum of integers: " + sumOfList(integers)); // 輸出: 6.0List<Double> doubles = Arrays.asList(1.2, 2.3, 3.5);System.out.println("Sum of doubles: " + sumOfList(doubles)); // 輸出: 7.0}
}

🔍 解析

  • sumOfList(List<? extends Number> list) 接受 Number 及其所有子類
  • list 可以是 List<Integer>List<Double>List<Float> 等。
  • n.doubleValue() ? 安全調用 Number 類的方法,因為所有 Number 的子類都繼承了 doubleValue()

4. 注意事項:為什么不能向 List<? extends T> 添加元素?

? List<? extends T> 中,我們無法添加元素(除了 null),否則會導致編譯錯誤。

? 錯誤示例

List<? extends Number> list = new ArrayList<Integer>();
list.add(5);  // ? 編譯錯誤
list.add(3.14); // ? 編譯錯誤

🔍 為什么?

  • list 可能是 List<Integer>,但 list.add(3.14) 試圖添加 Double,這會破壞 List<Integer> 的類型安全性。
  • Java 編譯器無法確保 list 的實際類型,因此不允許添加元素,但可以安全讀取元素(因為所有元素都是 Number)。

? 解決方案

List<Number> list = new ArrayList<>();
list.add(5);      // ? 允許
list.add(3.14);   // ? 允許

如果需要向列表添加元素,就不能使用 ? extends T,而應該使用具體類型 T


5. 適用場景

? 適用于只“讀取”數據的情況(Producer)。
? 適用于同一繼承層級中的多個泛型類型(如 Number 的子類)。
? 適用于通用方法,使代碼更具靈活性


6. 結論

? ? extends T 表示 T 及其所有子類,適用于“讀取”數據的情況
? 無法向 List<? extends T> 添加元素,因為 Java 無法確保其實際類型。
? 使用 ? extends T 可以增強代碼的通用性,避免代碼重復
? 典型用法:計算數值列表的總和,遍歷對象并調用父類方法


🎯 記住口訣:

  • Producer Extends (? extends T) 👉 用于“讀取”數據
  • Consumer Super (? super T) 👉 用于“寫入”數據

🚀 泛型讓 Java 代碼更靈活,學會 ? extends T,讓你的代碼更通用!

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

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

相關文章

【1】YOLOv13 AI大模型-可視化圖形用戶(GUI)界面系統開發

【文章內容適用于任意目標檢測任務】【GUI界面系統不局限于YOLOV13&#xff0c;主流YOLO系列模型同樣適用】本文以車輛行人檢測為背景&#xff0c;介紹基于【YOLOV13模型】和【AI大模型】的圖形用戶&#xff08;GUI&#xff09;界面系統的開發。助力大論文實現目標檢測模型的應…

小程序常用api

1. wx.request - 發起網絡請求 用于向服務器發送 HTTP 請求&#xff0c;獲取數據或提交表單。 // 示例&#xff1a;GET 請求獲取數據 wx.request({url: https://api.example.com/data, // 替換為實際 API 地址method: GET,success: (res) > {console.log(請求成功, res.da…

PaliGemma 2-輕量級開放式視覺語言模型

PaliGemma 2是輕量級開放式視覺語言模型 (VLM)&#xff0c;靈感源自 PaLI-3&#xff0c;基于 SigLIP 視覺模型和 Gemma 語言模型等開放式組件。PaliGemma 同時接受圖片和文本作為輸入&#xff0c;并且可以回答有關圖片的詳細問題和背景信息。PaliGemma 2 提供 30 億、100 億和 …

騰訊云云服務器深度介紹

以下是圍繞騰訊云云服務器&#xff08;CVM&#xff09;的詳細介紹與推薦文章&#xff0c;結合其核心優勢、應用場景及技術特性&#xff0c;為不同用戶群體提供參考&#xff1a; &#x1f680; 一、產品定位與核心價值 騰訊云云服務器&#xff08;Cloud Virtual Machine, CVM&a…

Ceph OSD.419 故障分析

Ceph OSD.419 故障分析 1. 問題描述 在 Ceph 存儲集群中&#xff0c;OSD.419 無法正常啟動&#xff0c;系統日志顯示服務反復重啟失敗。 2. 初始狀態分析 觀察到 OSD.419 服務啟動失敗的系統狀態&#xff1a; systemctl status ceph-osd419 ● ceph-osd419.service - Ceph obje…

MySQL持久化原理及其常見問題

目錄 MySQL刷盤原理 臟頁和干凈頁 MySQL出現短暫的堵塞SQL現象 情況分析 應對措施 數據庫表中數據刪除原理 刪除表中數據數據庫空間大小不會改變 情況分析 應對措施 MySQL刷盤原理 一般主要分為兩個步驟 內存更新和 redo log 記錄是同一事務修改的兩個必要操作&#…

VSCode中Cline無法正確讀取終端的問題解決

出現的問題是&#xff1a;Cline 無法正確讀取終端輸出。 Shell Integration Unavailable Cline won’t be able to view the command’s output. Please update VSCode (CMD/CTRL Shift P → “Update”) and make sure you’re using a supported shell: zsh, bash, fish, o…

scalelsd 筆記 線段識別 本地部署 模型架構

ant-research/scalelsd | DeepWiki https://arxiv.org/html/2506.09369?_immersive_translate_auto_translate1 https://gitee.com/njsgcs/scalelsd https://github.com/ant-research/scalelsd https://huggingface.co/cherubicxn/scalelsd 模型鏈接&#xff1a; https…

Python, C ++開發個體戶/個人品牌打造APP

個體戶/個人品牌打造APP開發方案&#xff08;Python C&#xff09;一、技術選型與分工1. Python- 核心場景&#xff1a;后端API開發、數據處理、內容管理、第三方服務集成&#xff08;如社交媒體分享、支付接口&#xff09;。- 優勢&#xff1a;開發效率高&#xff0c;豐富的庫…

SQLAlchemy 常見問題筆記

文章目錄SQLAlchemy Session對象如何操作數據庫SQLAlchemy非序列化對象如何返回1.問題分析2.解決方案方法1&#xff1a;使用 Pydantic 響應模型&#xff08;推薦&#xff09;方法2&#xff1a;手動轉換為字典&#xff08;簡單快速&#xff09;方法3&#xff1a;使用 SQLAlchemy…

Shell腳本-uniq工具

一、前言在 Linux/Unix 系統中&#xff0c;uniq 是一個非常實用的文本處理命令&#xff0c;用于對重復的行進行統計、去重和篩選。它通常與 sort 搭配使用&#xff0c;以實現高效的文本數據清洗與統計分析。無論是做日志分析、訪問頻率統計&#xff0c;還是編寫自動化腳本&…

氛圍編碼(Vice Coding)的工具選擇方式

一、前言 在寫作過程中&#xff0c;我受益于若干優秀的博客分享&#xff0c;它們給予我寶貴的啟發&#xff1a; 《5分鐘選對AI編輯器&#xff0c;每天節省2小時開發時間讓你早下班&#xff01;》&#xff1a;https://mp.weixin.qq.com/s/f0Zm3uPTcNz30oxKwf1OQQ 二、AI編輯的…

[硬件電路-57]:根據電子元器件的受控程度,可以把電子元器件分為:不受控、半受控、完全受控三種大類

根據電子元器件的受控程度&#xff0c;可將其分為不受控、半受控、完全受控三大類。這種分類基于元器件的工作狀態是否需要外部信號&#xff08;如電壓、電流、光、熱等&#xff09;的主動調控&#xff0c;以及調控的精確性和靈活性。以下是具體分類及實例說明&#xff1a;一、…

基于Pytorch的人臉識別程序

人臉識別原理詳解人臉識別是模式識別和計算機視覺領域的重要研究方向&#xff0c;其目標是從圖像或視頻中識別出特定個體的身份。現代人臉識別技術主要基于深度學習方法&#xff0c;特別是卷積神經網絡 (CNN)&#xff0c;下面從多個維度詳細解析其原理&#xff1a;1. 人臉識別的…

ubuntu 開啟ssh踩坑之旅

文章目錄確認當前用戶為普通用戶 or root命令使用ssh還是sshd服務名稱的由來apt update和apt upgrade的關系apt upgrade報錯&#xff1a;“E: 您在 /var/cache/apt/archives/ 上沒有足夠的可用空間”開啟ssh步驟錯誤排查查看日志修改sshd_config文件允許防火墻通過22端口確認當…

力扣:動態規劃java

sub07 線性DP - O(1) 狀態轉移2_嗶哩嗶哩_bilibili 跳樓梯 class Solution {public int climbStairs(int n) {if (n < 1) {return 1; // 處理邊界情況}int[] dp new int[n 1]; // 創建長度為n1的數組&#xff0c;比方說跳二級樓梯dp[0] 1; // 初始值設定dp[1] 1;for (…

React Native打開相冊選擇圖片或拍照 -- react-native-image-picker

官方文檔&#xff1a;https://www.npmjs.com/package/react-native-image-picker 場景&#xff1a;點擊按鈕打開相冊選擇圖片或者點擊按鈕拍照 import { launchCamera, launchImageLibrary } from react-native-image-picker;// ... <TouchableOpacityactiveOpacity{0.7}o…

USRP B210生成信號最大帶寬測試之Frank

書接上文&#xff1a; USRP B210生成LFM,SFM,BPSK,Frank信號的最大帶寬測試&#xff08;一&#xff09; USRP B210生成信號最大帶寬測試&#xff08;二&#xff09;SFM USRP B210生成信號最大帶寬測試&#xff08;三&#xff09;LFM USRP B210生成信號最大帶寬測試之BPSK …

pages.json頁面路由中,globalStyle的各個屬性

歡迎來到我的UniApp技術專欄&#xff01;&#x1f389; 在這里&#xff0c;我將與大家分享關于UniApp開發的實用技巧、最佳實踐和項目經驗。 專欄特色&#xff1a; &#x1f4f1; 跨平臺開發一站式解決方案 &#x1f680; 從入門到精通的完整學習路徑 &#x1f4a1; 實戰項目經…

[前端技術基礎]CSS選擇器沖突解決方法-由DeepSeek產生

在 CSS 中&#xff0c;當多個選擇器對同一元素的相同屬性&#xff08;如顏色&#xff09;定義發生沖突時&#xff0c;瀏覽器會通過層疊規則&#xff08;Cascading&#xff09;解決沖突。具體優先級從高到低如下&#xff1a;1. !important 規則&#xff08;最高優先級&#xff0…