135. Java 泛型 - 無界通配符

文章目錄

  • 135. Java 泛型 - 無界通配符 (`?`)
    • **1. 什么是無界通配符 (`?`)?**
    • **2. 為什么使用無界通配符?**
    • **3. 示例:使用 `?` 處理任意列表**
      • **? 錯誤示例**
      • **? 正確示例**
    • **4. 為什么 `List<Object>` 和 `List<?>` 不一樣?**
      • **? 錯誤示例**
    • **5. 適用場景**
    • **6. 結論**

135. Java 泛型 - 無界通配符 (?)

在 Java 泛型中,無界通配符 (?) 允許表示任何類型,使代碼更加通用。

本篇將詳細講解無界通配符的概念,并結合示例幫助理解。


1. 什么是無界通配符 (?)?

無界通配符 ? 代表“未知類型”,它可以用于泛型類或泛型方法,使其適用于任意類型

例如:

List<?> list;
  • list 可以接受 List<String>List<Integer>List<Double> 等任何類型的 List
  • 但由于 ? 代表未知類型,無法向 list 中添加元素(除了 null)。

2. 為什么使用無界通配符?

無界通配符適用于以下兩種情況:

  1. 僅使用 Object 類的方法,而不需要特定類型的方法(如 toString()equals()hashCode())。
  2. 方法的邏輯不依賴于泛型類型參數,如 List.size()List.clear()

? 無界通配符的語法

List<?> list = new ArrayList<String>();
  • 這里 list 可以引用任何類型ListList<Integer>List<Double> 等)。
  • 但是,我們不能向 list 添加元素(除了 null)。

3. 示例:使用 ? 處理任意列表

📌 需求:編寫一個方法,能夠打印任何類型的 List,包括 List<String>List<Integer>List<Double> 等。

? 錯誤示例

以下代碼無法打印 List<Integer>,因為 List<Integer> 不是 List<Object> 的子類:

public static void printList(List<Object> list) { // ? 只能接受 List<Object>for (Object elem : list)System.out.println(elem);
}public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3);printList(numbers); // ? 編譯錯誤
}

🔍 為什么?

  • List<Integer> 不是 List<Object> 的子類(因為泛型是不協變的)。
  • Java 泛型中的 List<T>不可變更類型的,即 List<Integer>List<Object> 沒有繼承關系。

? 正確示例

import java.util.Arrays;
import java.util.List;public class UnboundedWildcard {public static void printList(List<?> list) { // ? 適用于任何 List 類型for (Object elem : list) { // ? 安全讀取元素System.out.print(elem + " ");}System.out.println();}public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3);List<String> words = Arrays.asList("Hello", "World");List<Double> decimals = Arrays.asList(1.1, 2.2, 3.3);printList(numbers); // 輸出: 1 2 3 printList(words);   // 輸出: Hello World printList(decimals); // 輸出: 1.1 2.2 3.3}
}

🔍 解析

  • printList(List<?>) 可以接受任何 List<T>,如 List<Integer>List<String>List<Double> 等。
  • Object elem 安全讀取 list 的元素,因為所有 Java 對象最終都繼承自 Object
  • 但我們不能向 list 添加元素(除了 null)。

4. 為什么 List<Object>List<?> 不一樣?

在 Java 泛型中,List<Object>List<?> 并不相同

  1. List<Object> 只能存儲 Object 及其子類,但不能存儲 IntegerString,因為 List<Integer> 不是 List<Object> 的子類。
  2. List<?> 可以存儲任何類型的 List,但由于類型未知,無法向 List<?> 添加元素(除了 null)。

? 錯誤示例

List<?> unknownList = new ArrayList<Integer>();
unknownList.add(5); // ? 編譯錯誤
unknownList.add("Hello"); // ? 編譯錯誤
unknownList.add(null); // ? 允許

🔍 為什么?

  • unknownList 可以引用 List<Integer>List<String>List<Double>,但Java 無法確定具體的類型,所以不允許添加元素。
  • 但**null 可以插入**,因為 null 適用于任何類型。

5. 適用場景

? 適用于不關心具體類型的 List(如通用的 printList 方法)。
? 適用于使用 Object 方法的情況(如 toString()size()clear())。
? 適用于泛型方法,使代碼更加靈活


6. 結論

? ? 表示“未知類型”,可以匹配任意泛型類型
? List<?> 可以存儲 List<T> 的任何類型,但不能添加元素(除了 null
? List<?>List<Object> 不同,前者適用于任何 List<T>,而后者僅適用于 List<Object>
? 使用 ? 讓代碼更加通用,提高可復用性


🎯 記住口訣:

  • 無界通配符 ? 適用于“只讀”數據(與 Object 兼容)
  • List<?> 不能添加元素,避免類型不安全問題
  • List<?> 適用于“泛型無關”的方法,如 size()clear()toString()

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

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

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

相關文章

NOIP提高組|2010T1機器翻譯

NOIP2010年提高組第一題:機器翻譯 題目描述 小晨的電腦上安裝了一個機器翻譯軟件,他經常用這個軟件來翻譯英語文章。 這個翻譯軟件的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對于每個英文單詞,軟件會先在內存中查找這個單詞的中文含義,如果…

Change Data Capture (CDC) with Kafka Connect:實時數據同步的完整指南

Change Data Capture (CDC) 是一種高效的數據同步技術&#xff0c;能夠捕獲數據庫的變更&#xff08;插入、更新、刪除&#xff09;并實時傳輸到其他系統。結合 Kafka Connect&#xff0c;我們可以構建一個可靠、可擴展的 CDC 管道&#xff0c;實現數據庫與數據湖、數據倉庫或消…

云手機網絡加速全攻略:解決游戲卡頓與APP連接失敗困擾

用云手機玩游戲、掛腳本、跑自動任務&#xff0c;明明后臺顯示在線&#xff0c;但畫面卡頓、操作延遲、甚至APP直接“轉圈圈連不上”&#xff0c;是不是很抓狂&#xff1f;問題出在哪里&#xff1f;云手機不卡&#xff0c;網絡卡&#xff1f;其實&#xff0c;大多數云手機的性能…

從“數字土著”到“數據公民”:K-12數據倫理課程的設計、實施與成效追蹤研究

一、引言 1.1 研究背景與意義 在當今數字時代&#xff0c;信息技術以前所未有的速度滲透到社會的各個領域&#xff0c;深刻地改變了人們的生活、工作和學習方式。K-12 教育作為基礎教育的關鍵階段&#xff0c;也在數字化浪潮的推動下發生著巨大的變革。隨著大數據、人工智能…

LVS詳解

LVS(Linux virtual server)簡介即linux虛擬服務器四層負載均衡基本上都會使用 LVS&#xff0c;據了解 BAT 等大廠都是 LVS 重度使用者&#xff0c;就是因為 LVS 非常出色的性能&#xff0c;能為公司節省巨大的成本。LVS&#xff0c;全稱 Linux Virtual Server 是由國人章文嵩博…

Linux內核設計與實現 - 第5章 系統調用

目錄一、系統調用概述二、系統調用實現機制四、性能優化技術五、常見問題排查六、安全注意事項一、系統調用概述 定義 用戶空間訪問內核功能的唯一合法入口提供硬件抽象接口&#xff0c;保證系統穩定和安全 與API區別 特性系統調用API執行層級內核態用戶態實現方式軟中斷(int …

紙板制造糊機操作

糊機操作技巧:開機流程&#xff1a;首先&#xff0c;一切的一切&#xff0c;要看懂生管&#xff0c;我們要用哪個楞別&#xff0c;再看哪個門幅和材質。 也就是說&#xff0c;一切的一切&#xff0c;要生產了&#xff0c;原紙不能用錯了吧&#xff01; 第一步&#xff1a; 壓壓…

WPF 多窗口分文件實現方案

WPF 多窗口分文件實現方案 項目文件結構 WindowSwitcher/ ├── App.xaml ├── App.xaml.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Views/ │ ├── SettingsWindow.xaml │ ├── SettingsWindow.xaml.cs │ ├── DataWindow.xaml │ ├─…

在服務器(ECS)部署 MySQL 操作流程

在部署 MySQL 數據庫之前需要準備好服務器環境。可以通過以下兩種方式來準備部署服務器&#xff1a;云服務器&#xff08;ECS&#xff09;&#xff0c;如&#xff1a;阿里云、華為云、騰訊云等。IDC服務器。 現以阿里云服務器&#xff08;ECS&#xff09;Windows版本來進行部署…

Java File 類詳解:從基礎操作到實戰應用,掌握文件與目錄處理全貌

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過需要操作文件或目錄的場景&#xff0c;例如&#xff1a;讀寫配置文件、上傳下載、日志處理、文件遍歷、路徑管理等。Java 提供了 java.io.File 類來幫助開發者完成這些任務。本文將帶你全面掌握&#xff1a;File …

嵌入式學習-PyTorch(9)-day25

進入尾聲&#xff0c;一個完整的模型訓練 &#xff0c;點亮的第一個led#自己注釋版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

用AI做帶貨視頻評論分析進階提分【Datawhale AI 夏令營】

文章目錄回顧賽題優化1??優化2??回顧賽題 模塊內容類型說明/示例賽題背景概述參賽者需構建端到端評論分析系統&#xff0c;實現商品識別、多維情感分析、評論聚類與主題提煉三大任務。商品識別輸入video_desc&#xff08;視頻描述&#xff09; video_tags&#xff08;標簽…

Redis常見數據結構詳細介紹

Redis 作為一款高性能的開源內存數據庫&#xff0c;憑借其豐富多樣的數據結構和出色的性能&#xff0c;在緩存、會話存儲、實時分析等眾多場景中得到了廣泛應用。下面將詳細介紹 Redis 主要的數據結構&#xff0c;包括它們的類型、具體用法和適用場景。1、字符串&#xff08;St…

HAMR硬盤高溫寫入的可靠性問題

熱輔助磁記錄(HAMR)作為突破傳統磁記錄密度極限的下一代存儲技術,其在數據中心大規模應用的核心挑戰在于可靠性保障。 擴展閱讀: 下一個存儲戰場:HAMR技術HDD HAMR技術進入云存儲市場! 漫談HAMR硬盤的可靠性 隨著存儲密度向4Tbpsi邁進,傳統磁記錄技術遭遇"三難困境…

使用llama-factory進行qwen3模型微調

運行環境 Linux 系統(ubuntu) Gpu (NVIDIA) 安裝部署 llama factory CUDA 安裝 首先,在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CUDA 保證當前 Linux 版本支持CUDA. 在命令行中輸入 uname -m && cat /etc/*release,應當看到類似的輸出 x8…

tcp/udp調試工具

幾款tcp/udp調試工具 下載地址&#xff1a;夸克網盤

智慧光伏發電信息化系統需求文檔

以下是從產品經理角度撰寫的智慧光伏發電信息化系統需求文檔&#xff0c;聚焦光伏行業痛點與業務價值&#xff0c;遵循標準PRD結構&#xff1a;智慧光伏發電信息化系統需求文檔 版本&#xff1a;1.0 日期&#xff1a;2025年7月19日 作者&#xff1a;產品經理視角一、文檔概述 1…

ARCS系統機器視覺實戰(直播回放)

ARCS系統機器視覺實戰本次培訓主要圍繞ARCS操作系統中的視覺與機器人同步應用展開&#xff0c;詳細講解了網絡配置、視覺軟件設置、九點標定、機器人程序編寫以及數據通信等內容。以下是關鍵要點提煉&#xff1a; 網絡配置 為機器人、相機和電腦分別設置靜態IP地址&#xff0c;…

Http請求中的特殊字符

問題 一個 springboot 應用&#xff0c;包含如下 controller RestController public class DemoController {GetMapping("/get")public ResponseEntity<String> get(RequestParam(value "cid2") String cid2) 準備測試數據 String cid2 "…

告別手動報表開發!描述數據維度,AI 自動生成 SQL 查詢 + Java 導出接口

Java 開發中&#xff0c;報表模塊往往是 “隱形耗時大戶”—— 產品經理要 “按地區、月份統計訂單量”&#xff0c;開發者需先編寫 SQL 查詢&#xff0c;再手動開發導出接口&#xff0c;稍作調整又要重新調試&#xff0c;耗費大量時間在重復勞動上。飛算 JavaAI 通過 “數據維…