`ParameterizedType` 和 `TypeVariable` 的區別

在 Java 的泛型系統中,ParameterizedTypeTypeVariable 是兩個不同的類型表示,它們都屬于 java.lang.reflect.Type 接口的子接口。兩者都在反射(Reflection)中用于描述泛型信息,但用途和含義不同。


🌟 一、概念區別

類型名稱所屬包含義
ParameterizedTypejava.lang.reflect表示一個參數化類型,即帶有泛型參數的類型,例如 List<String>Map<Integer, String> 等。
TypeVariablejava.lang.reflect表示類型變量,也就是泛型中的占位符,如 TKV 等。

🧩 二、具體解釋

1. ParameterizedType

  • 定義:
    表示一個已經被參數化的泛型類型。

  • 常見例子:

    • List<String>
    • Map<Integer, User>
    • Optional<T>
  • 方法:

    Type[] getActualTypeArguments(); // 獲取實際類型參數,如 String、Integer
    Type getRawType();                // 獲取原始類型,如 List、Map
    Type getOwnerType();              // 如果是內部類,返回外部類類型
    
  • 使用場景:
    在反射中獲取字段或方法的返回值類型時,如果它是參數化類型,就會返回 ParameterizedType

示例:
Field field = MyClass.class.getDeclaredField("list");
Type type = field.getGenericType();if (type instanceof ParameterizedType pType) {Type rawType = pType.getRawType(); // java.util.ListType[] typeArgs = pType.getActualTypeArguments(); // [class java.lang.String]
}

2. TypeVariable

  • 定義:
    表示泛型中的類型變量(通常用 T、E、K、V 表示),這些變量會在編譯后被擦除,但在反射中可以獲取其信息。

  • 常見例子:

    • 泛型類定義中的 <T>
    • 方法簽名中的 <K, V> Map<K,V> getMap()
  • 方法:

    String getName();                  // 獲取變量名,如 "T"
    Type[] getBounds();                // 獲取上界,默認是 Object
    GenericDeclaration getGenericDeclaration(); // 返回聲明該變量的類或方法
    
  • 使用場景:
    當你查看泛型類或方法的類型參數時,會得到 TypeVariable

示例:
public class Box<T> {private T value;
}Field field = Box.class.getDeclaredField("value");
Type type = field.getGenericType();if (type instanceof TypeVariable<?> tv) {System.out.println(tv.getName());      // TSystem.out.println(Arrays.toString(tv.getBounds())); // [class java.lang.Object]
}

🔍 三、總結對比表

特性ParameterizedTypeTypeVariable
表示類型已經被參數化的類型泛型類型變量(未指定具體類型)
常見形式List<String>Map<K, V>TEK
是否有實際類型參數? 有 (getActualTypeArguments)? 沒有
是否代表泛型變量??
使用場景獲取具體泛型類型信息獲取泛型變量本身信息
是否能直接用于創建對象?(運行時被擦除)?(只是一個變量)

💡 四、關系說明

在泛型類型中,TypeVariable 是泛型參數的“名字”,而 ParameterizedType 是這個“名字”被替換為具體類型的實例。

比如:

class Box<T> {T content;
}
  • content 字段的泛型類型是 T,是一個 TypeVariable
  • 如果你在某個地方這樣使用:
    Box<String> box = new Box<>();
    
    那么這里的 Box<String> 就是一個 ParameterizedType,其中 String 是對 T 的具體化

? 五、補充:其他相關類型

除了這兩個類型外,Java 反射中還有幾個重要的類型接口:

類型說明
Class<T>表示具體的類或基本類型
WildcardType表示通配符類型,如 ? extends Number? super String
GenericArrayType表示泛型數組,如 T[]

在處理 JSON 反序列化(如 Gson、Jackson)、動態代理、框架設計等需要保留泛型信息的場景,理解這些類型是非常關鍵的。

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

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

相關文章

PR-2021

推薦深藍學院的《深度神經網絡加速&#xff1a;cuDNN 與 TensorRT》&#xff0c;課程面向就業&#xff0c;細致講解CUDA運算的理論支撐與實踐&#xff0c;學完可以系統化掌握CUDA基礎編程知識以及TensorRT實戰&#xff0c;并且能夠利用GPU開發高性能、高并發的軟件系統&#xf…

unity使用ZXing.Net生成二維碼

下載鏈接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 編譯SRS和ZLMediaKit用于視頻推拉流

SRS實現視頻的rtmp webrtc推流 ZLMediaKit編譯生成MediaServer實現rtsp推流 SRS指定某個固定網卡&#xff0c;修改程序后重新編譯 打開SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp&#xff0c;在 232 行后面添加&#xff1a; ZLMediaKit編譯后文件存放在ZLMediakit/rele…

如何備考GRE?

1.引言 GRE和雅思不太相同&#xff0c;首先GRE是美國人的考試&#xff0c;思維方式和很多細節和英系雅思不一樣。所以底層邏輯上我覺得有點區別。 難度方面&#xff0c;我感覺GRE不容易考低分&#xff0c;但考高分較難。雅思就不一樣了不僅上限難突破&#xff0c;下限還容易6…

uniapp|商品列表加入購物車實現拋物線動畫效果、上下左右拋入、多端兼容(H5、APP、微信小程序)

以uniapp框架為基礎,詳細解析商品列表加入購物車拋物線動畫的實現方案。通過動態獲取商品點擊位置與購物車坐標,結合CSS過渡動畫模擬拋物線軌跡,實現從商品圖到購物車圖標的動態效果。 目錄 核心實現原理坐標動態計算拋物線軌跡模擬?動畫元素控制代碼實現詳解模板層設計腳本…

React中使用openLayer畫地圖

OpenLayers&#xff08;簡稱ol&#xff09;是一個?開源的WebGIS前端開發庫?&#xff0c;基于JavaScript實現&#xff0c;主要用于在網頁中嵌入動態二維地圖。 官方網站&#xff1a; https://openlayers.org 中文官網&#xff1a; https://openlayers.vip 大家可以去參考學習…

WHAT - 緩存命中 Cache Hit 和緩存未命中 Cache Miss

文章目錄 一、什么是緩存命中&#xff1f;二、前端開發要知道哪些緩存機制&#xff08;以及命中條件&#xff09;&#xff1f;1. 瀏覽器緩存&#xff08;主要針對靜態資源&#xff09;常見的緩存位置關鍵 HTTP 頭字段&#xff08;決定命中與否&#xff09; 2. 前端應用層緩存&a…

10 個可靠的 Android 文件傳輸應用程序

Android 文件傳輸是 Android 用戶的常見需求。我們經常需要將文件從一臺 Android 設備傳輸到 PC 或 Mac。但我們怎樣才能做到這一點呢&#xff1f;俗話說&#xff0c;工欲善其事&#xff0c;必先利其器。因此&#xff0c;首先了解 10 個鋒利的 Android 文件傳輸應用程序&#x…

AlphaEvolve:LLM驅動的算法進化革命與科學發現新范式

AlphaEvolve&#xff1a;LLM驅動的算法進化革命與科學發現新范式 本文聚焦Google DeepMind最新發布的AlphaEvolve&#xff0c;探討其如何通過LLM與進化算法的結合&#xff0c;在數學難題突破、計算基礎設施優化等領域實現革命性進展。從48次乘法優化44矩陣相乘到數據中心資源利…

Java大師成長計劃之第24天:Spring生態與微服務架構之分布式配置與API網關

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4-turbo模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中關鍵數據、代碼與結論建議通過官方渠道驗證。 在微服務架構中&#xff0c;如何管理…

eSwitch manager 簡介

eSwitch manager 的定義和作用 eSwitch manager 通常指的是能夠配置和管理 eSwitch&#xff08;嵌入式交換機&#xff09;的實體或接口。在 NVIDIA/Mellanox 的網絡架構中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充當 eSwitch manager&am…

最新開源 TEN VAD 與 Turn Detection 讓 Voice Agent 對話更擬人 | 社區來稿

關鍵詞&#xff1a;對話式 AI | 語音智能體 | Voice Agent | VAD | 輪次檢測 | 聲網 | TEN GPT-4o 所展示對話式 AI 的新高度&#xff0c;正一步步把我們在電影《Her》中看到的 AI 語音體驗變成現實。AI 的語音交互正在變得更豐富、更流暢、更易用&#xff0c;成為構建多模態智…

AI實踐用例---日程規劃(通用日程管理文件ICS)靈感踩坑日常

我是一位踐行獨立開發者之路的菜鳥開發者。 由于執行力較差,常常有很多想法但是很多時候沒有去踐行。 所以我有了讓大模型為我生成日程安排的想法,這確實可以,很簡單。只需要將你的想法告訴ai就行了。 例如: 發給AI的提示詞: 我想你幫我對,嗯,未來的一年做一個嗯,大…

大疆無人機??DRC 鏈路

在大疆上云API中&#xff0c;??DRC 鏈路??通常指 ??Device-Cloud Remote Control Link&#xff08;設備-云端遠程控制鏈路&#xff09;??&#xff0c;它是無人機&#xff08;或設備&#xff09;與云端服務之間建立的??實時控制與數據傳輸通道??&#xff0c;用于實現…

tomcat一閃而過,按任意鍵繼續以及控制臺中文亂碼問題

問題描述 今天在打開tomcat,啟動startup.bat程序時 tomcat直接閃退,后面查找資料后發現,可以通過編輯startup.bat文件內容,在最后一行加入pause即可讓程序不會因為異常而終止退出 這樣方便查看tomcat所爆出的錯誤: 然后,我明確看到我的tomcat啟動程序顯示如下的內容,沒有明確…

中大型水閘安全監測系統解決方案

一、方案概述 中大型水閘作為水利工程的重要組成部分&#xff0c;承擔著調節水位、控制水流、防洪排澇等多重功能&#xff0c;在防洪減災、水資源配置、生態環境改善等方面發揮著巨大作用。然而&#xff0c;由于歷史原因&#xff0c;許多水閘存在建設標準偏低、質量較差、配套設…

軌跡誤差評估完整流程總結(使用 evo 工具)

roslaunch .launch rosbag play your_dataset.bag -r 2.0 ? 第二步&#xff1a;錄制估計軌跡 bash 復制編輯 rosbag record -O traj_only.bag /aft_mapped_to_init 運行一段時間后 CtrlC 停止&#xff0c;生成 traj_only.bag 第三步&#xff1a;提取估計軌跡和真值軌跡為…

Linux任務管理與守護進程

目錄 任務管理 jobs&#xff0c;fg&#xff0c;bg 進程組概念 任務概念 守護進程 守護進程的概念 守護進程的查看 守護進程的創建 ?編輯模擬實現daemon函數 任務管理 每當有一個用戶登錄Linux時&#xff0c;系統就會創建一個會話&#xff08;session&#xff09; 任何…

Json rpc 2.0比起傳統Json在通信中的優勢

JSON-RPC 2.0 相較于直接使用傳統 JSON 進行通信&#xff0c;在協議規范性、開發效率、通信性能等方面具有顯著優勢。以下是核心差異點及技術價值分析&#xff1a; 一、結構化通信協議&#xff0c;降低開發成本 傳統 JSON 通信需要開發者自定義數據結構和處理邏輯&#xff0c;…

機器學習與人工智能:NLP分詞與文本相似度分析

DIY AI & ML NLP — Tokenization & Text Similarity by Jacob Ingle in Data Science Collective 本文所使用的數據是在 Creative Commons license 下提供的。盡管我們已盡力確保信息的準確性和完整性&#xff0c;但我們不對數據的完整性或可靠性做任何保證。數據的使…