TypeReference 泛型的使用場景及具體使用流程

簡介

在 Java 中,泛型類型在運行時會被擦除。這意味著當我們使用泛型時,運行時無法直接獲取到泛型的具體類型信息。例如,我們無法直接通過 Class 對象來獲取一個泛型類型的類型參數。這在某些情況下可能會導致問題,特別是在我們需要對泛型類型進行反射操作時。

TypeReference 是 Jackson 庫提供的一個類,它可以幫助我們解決這個問題。通過 TypeReference,我們可以在運行時保留泛型的類型信息,從而能夠正確地處理復雜的泛型類型。

本文將詳細介紹 TypeReference 泛型的使用場景及具體使用流程,并通過一個實際例子展示如何在自定義 HttpClient 中使用 TypeReference

使用場景

處理復雜泛型的 JSON 反序列化

在使用 Jackson 庫進行 JSON 反序列化時,如果目標類型是一個復雜的泛型類型,直接使用 Class 對象可能會導致類型擦除問題,從而無法正確地反序列化。例如,我們有一個泛型類 Map<String, List<String>>,如果我們直接使用 Class<Map<String, List<String>>> 來進行反序列化,會因為類型擦除而無法正確地獲取到具體的泛型類型參數。

通過 TypeReference,我們可以正確地指定泛型類型參數,從而能夠正確地反序列化復雜的泛型類型。

處理復雜泛型的反射操作

在進行反射操作時,我們可能需要獲取泛型類型的類型參數。由于類型擦除,直接使用 Class 對象無法獲取到這些類型參數。而 TypeReference 可以幫助我們保留這些類型參數,從而能夠正確地進行反射操作。

具體使用流程

引入 Jackson 依賴

在使用 TypeReference 之前,我們需要先引入 Jackson 的依賴。如果你使用的是 Maven 項目,可以在 pom.xml 文件中添加以下依賴:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>

定義 TypeReference 的子類

為了使用 TypeReference,我們需要定義一個 TypeReference 的子類。這個子類需要繼承自 TypeReference,并且指定具體的泛型類型。例如,如果我們需要處理 Map<String, List<String>> 類型,可以這樣定義:

new TypeReference<Map<String, List<String>>>() {};

使用 TypeReference 進行 JSON 反序列化

在使用 Jackson 進行 JSON 反序列化時,我們可以使用 TypeReference 來指定具體的泛型類型。例如:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException;
import java.util.List;
import java.util.Map;public class TypeReferenceExample {public static void main(String[] args) throws IOException {String json = "{\"key1\":[\"value1\",\"value2\"],\"key2\":[\"value3\",\"value4\"]}";ObjectMapper objectMapper = new ObjectMapper();TypeReference<Map<String, List<String>>> typeReference = new TypeReference<Map<String, List<String>>>() {};Map<String, List<String>> map = objectMapper.readValue(json, typeReference);System.out.println(map);}
}

在上面的代碼中,我們定義了一個 TypeReference<Map<String, List<String>>> 的子類,并將其傳遞給 ObjectMapperreadValue 方法。這樣,Jackson 就可以正確地反序列化 JSON 字符串到 Map<String, List<String>> 類型。

使用 TypeReference 進行反射操作

在進行反射操作時,我們可以通過 TypeReference 獲取泛型類型的類型參數。例如:

import com.fasterxml.jackson.core.type.TypeReference;import java.lang.reflect.Type;public class TypeReferenceReflectionExample {public static void main(String[] args) {TypeReference<Map<String, List<String>>> typeReference = new TypeReference<Map<String, List<String>>>() {};Type type = typeReference.getType();System.out.println(type);}
}

在上面的代碼中,我們通過 TypeReferencegetType 方法獲取了泛型類型的 Type 對象。這個 Type 對象包含了泛型類型的類型參數信息,我們可以使用它來進行反射操作。

實際例子:HttpClient 通用類實現

在實際開發中,我們經常需要與外部服務進行 HTTP 通信。為了提高代碼的復用性和可維護性,我們通常會自定義一個 HttpClient 類,用于封裝 HTTP 請求和響應處理。由于返回值類型不固定,我們可以使用 TypeReference 來實現一個通用的 HttpClient 類。

定義 HttpClient 類

我們定義一個通用的 HttpClient 類,用于發送 HTTP 請求并處理響應。這個類將使用 TypeReference 來支持返回值類型不固定的場景。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClient {private static final ObjectMapper objectMapper = new ObjectMapper();private static final CloseableHttpClient httpClient = HttpClients.createDefault();public static <T> T get(String url, TypeReference<T> typeReference) throws IOException {HttpGet httpGet = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(httpGet)) {String jsonResponse = EntityUtils.toString(response.getEntity());return objectMapper.readValue(jsonResponse, typeReference);}}
}

使用 HttpClient 類

我們可以使用 HttpClient 類來發送 HTTP 請求,并指定返回值的類型。例如,假設我們有一個外部服務返回一個 Map<String, List<String>> 類型的 JSON 數據,我們可以這樣使用 HttpClient 類:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.List;
import java.util.Map;public class HttpClientExample {public static void main(String[] args) {try {String url = "https://api.example.com/data";Map<String, List<String>> result = HttpClient.get(url, new CustomTypeReference().mapReference);System.out.println(result);} catch (IOException e) {e.printStackTrace();}}
}

自定義 TypeReference

import java.util.List;
import java.util.Map;import com.fasterxml.jackson.core.type.TypeReference;/*** CustomTypeReference 自定義TypeReference** @author xxx* @since 2025/7/24*/
public class CustomTypeReference {public TypeReference<Map<String, List<String>>> mapReference =new TypeReference<Map<String, List<String>>>() {};
}

在上面的代碼中,我們定義了一個 TypeReference<Map<String, List<String>>> 的子類,并將其傳遞給 HttpClient.get 方法。這樣,HttpClient 類就可以正確地反序列化返回的 JSON 數據到 Map<String, List<String>> 類型。


至此,本次分享到此結束啦!!!

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

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

相關文章

商超場景徘徊識別誤報率↓79%!陌訊多模態時序融合算法落地優化

原創聲明本文為原創技術解析文章&#xff0c;核心技術參數與架構設計引用自 “陌訊技術白皮書&#xff08;2024 版&#xff09;”&#xff0c;所有技術描述均經過重寫轉換&#xff0c;無復制官網文案行為&#xff0c;嚴禁未經授權轉載。一、行業痛點&#xff1a;徘徊識別的場景…

KubeBlocks AI:AI時代的云原生數據庫運維探索

KubeBlocks AI&#xff1a;AI時代的云原生數據庫運維探索 REF Auto-detect-failure 架構Auto-bug-detect測試 引言 傳統的自動化運維診斷主要依賴基于規則的方法——無論是Ansible Playbooks的預定義腳本&#xff0c;還是Kubernetes Operator的固化邏輯&#xff0c;這些方法…

如何編譯botan加密庫?

Botan加密庫支持2.x版本和3.x版本&#xff0c;其中3.x版本需要支持C20。0、下載源碼git clone https://github.com/randombit/botan.gitcd botan切換分支到2.19.5版本git checkout 2.19.51、Windows編譯Botan加密庫1.1 配置生成MakefileRelease模式python configure.py --ccmsv…

Linux問答題:分析和存儲日志

目錄 1. RHEL 日志文件保存在哪個目錄中&#xff1f; 2.什么是 syslog 消息和非 syslog 消息&#xff1f; 3.哪兩個服務處理 RHEL 中的 syslog 消息&#xff1f; 4. 列舉常用的系統日志文件并說明其存儲的消息類型。 5. 簡單說下日志文件輪轉的作用 6.systemd-journald 服…

chapter05_從spring.xml讀取Bean

一、簡化Bean的注冊 如果每次注冊一個Bean&#xff0c;都要像上節一樣&#xff0c;手動寫PropertyValues相關的代碼&#xff0c;那太復雜了&#xff0c;我們希望讀取XML文件&#xff0c;自動注冊Bean&#xff0c;這樣對于使用者&#xff0c;甚至不知道有BeanDefinition的存在 二…

【數位DP】D. From 1 to Infinity

Problem - D - Codeforces 題目&#xff1a; 思路&#xff1a; 數位DP 數論 題目讓我們求這個無限序列 123456789101112.... 的前 k 個數的數位和 題目看起來很不好求&#xff0c;事實上確實是這樣的 我們可以先從簡單問題開始 問題①. 求 k 位置對應著第幾個數 那么顯然…

gitlab、jenkins等應用集成ldap

gitlab、jenkins等應用集成ldap 文檔 openldap安裝 -添加條目gitlab、jenkins等應用集成ldap gitlab集成ldap gitlab版本&#xff1a;gitlab-jh-17.7.0 ldap版本&#xff1a;openldap-2.6.10 修改/etc/gitlab/gitlab.rb文件&#xff0c;編輯相關信息 gitlab_rails[ldap_en…

Unity中國小游戲行業沙龍:抖音小游戲平臺分析與規劃

目錄 一、抖音小游戲市場全景分析 行業現狀與發展趨勢 行業發展關鍵議題 內容運營生態觀察 二、平臺技術架構與運營體系 用戶復訪與留存體系 技術支撐體系 三、平臺激勵與商業化政策 收益分成機制 資金服務升級 技術基礎建設 四、生態合作與發展規劃 開發者支持體系…

手機橫屏適配方案

CSS自動旋轉頁面實戰指南在移動端開發中&#xff0c;橫屏適配是一個常見但棘手的問題。本文將深入解析一套完整的CSS橫屏適配方案&#xff0c;讓你的網頁在手機旋轉時自動調整布局&#xff0c;提供無縫的用戶體驗。一、橫屏適配的重要性 隨著移動設備使用場景的多樣化&#xff…

藍橋杯算法之基礎知識(2)——Python賽道

1.循環里面套用遞歸&#xff0c;當遞歸執行return時&#xff0c;只會退出當前遞歸層2.不能一邊遍歷list 一邊pop解決辦法&#xff1a;倒序遍歷解決或者創建新的列表去存儲3.sqrt求出來的始終是小數形式&#xff0c;注意題目要求的結果有可能是整型你直接sqrt就提交&#xff0c;…

如何優雅解決 OpenCV 分段錯誤(Segfault):子進程隔離實戰

在分布式數據平臺&#xff08;如 Databricks Spark&#xff09;中跑視頻處理任務時&#xff0c;你是否遇到過這種惡心的報錯&#xff1f;Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. : org.apache.spark.Spark…

Docker的六種網絡模式(詳解)

文章目錄1. bridge&#xff08;默認&#xff09;2. host3. none4. container5. overlay6. macvlan7. 總結對比Docker 六種網絡模式是容器網絡的基礎概念&#xff0c;不同模式決定容器與宿主機、外部網絡、其他容器之間的通信方式。 1. bridge&#xff08;默認&#xff09; Br…

微服務流量分發核心:Spring Cloud 負載均衡解析

目錄 理解負載均衡 負載均衡的實現方式 服務端負載均衡 客戶端負載均衡 Spring Cloud LoadBalancer快速上手 常見的負載均衡策略 自定義負載均衡策略 LoadBalancer 原理 理解負載均衡 在 Spring Cloud 微服務架構中&#xff0c;負載均衡&#xff08;Load Balance&#…

鴻蒙異步處理從入門到實戰:Promise、async/await、并發池、超時重試全套攻略

摘要&#xff08;介紹目前的背景和現狀&#xff09; 在鴻蒙&#xff08;HarmonyOS&#xff09;里&#xff0c;網絡請求、文件操作、數據庫訪問這類 I/O 都是異步的。主流寫法跟前端類似&#xff1a;Promise、async/await、回調。想把 app 做得“流暢且不阻塞”&#xff0c;核心…

【html2img/pdf 純!純!python將html保存為圖片/pdf!!效果非常的棒!】

素材 a.png html card.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>固定樣式卡片</title><style>/* 基礎樣式和頁面居中 */body {font-family: "微軟雅黑", "P…

帶寬評估(三)lossbase_v2

一、優化方向 調整丟包恢復算法的參數:可以通過調整算法中的一些參數,如丟包恢復速率、丟包恢復閾值等,來優化算法的性能。 調整發送窗口大小:在固定丟包場景下,可以通過調整發送窗口大小來控制發送速率,從而減少丟包率。 a=fmtp:96 x-google-min-bitrate=300 二、Goo…

imx6ull-驅動開發篇29——Linux阻塞IO 實驗

目錄 實驗程序編寫 blockio.c blockioApp.c Makefile 文件 運行測試 在之前的文章里&#xff0c;Linux阻塞和非阻塞 IO&#xff08;上&#xff09;&#xff0c;我們學習了Linux應用程序了兩種操作方式&#xff1a;阻塞和非阻塞 IO。 在Linux 中斷實驗中&#xff0c;Linux…

97. 小明逛公園,Floyd 算法,127. 騎士的攻擊,A * 算法

97. 小明逛公園Floyd 算法dijkstra, bellman_ford 是求單個起點到單個終點的最短路徑&#xff0c;dijkstra無法解決負權邊的問題&#xff0c; bellman_ford解決了負權邊的問題&#xff0c;但二者都是基于單起點和單終點。而Floyd 算法旨在解決多個起點到多個終點的最短路徑問題…

?崩壞世界觀中的安全漏洞與哲學映射:從滲透測試視角解構虛擬秩序的脆弱性?

?崩壞世界觀&#xff1a;游戲中的世界&#xff0c;是真實&#xff0c;也是虛幻的&#xff01;對于游戲中的NPC角色而言&#xff0c;TA們生存的世界&#xff0c;是真實的&#xff01;對于游戲玩家而言&#xff0c;游戲中的世界&#xff0c;是虛擬的&#xff01;通過沉浸式的游戲…

【離線安裝】CentOS Linux 7 上離線部署Oracle 19c(已成功安裝2次)

1.部署參考鏈接&#xff1a; CentOS 7 rpm方式離線安裝 Oracle 19chttps://blog.csdn.net/Vampire_1122/article/details/123038137?fromshareblogdetail&sharetypeblogdetail&sharerId123038137&sharereferPC&sharesourceweixin_45806267&sharefromfrom…