如何獲取Java集合中泛型的Class對象
獲取Java集合中泛型的Class對象
直接獲取時獲取不到的,類型被虛擬機擦除了
- 泛型的正常工作是依賴編譯器在編譯源碼的時候,先進行類型檢查,然后進行類型擦除并且在類型參數(shù)出現(xiàn)的地方插入強制轉(zhuǎn)換的相關(guān)指令實現(xiàn)的。編譯器在編譯時擦除了所有類型相關(guān)的信息,所以在運行時不存在任何類型相關(guān)的信息。例如List在運行時僅用一個List類型來表示。為什么要進行擦除呢?這是為了避免類型膨脹。
利用子類實現(xiàn)父類的泛型是可以的
如何才能獲取到泛型的類型
- 必須具有真實類型的存在
- 泛型的類型是明確的如 (List <User> 是明確的,List<T> 是不明確的)
嘗試
如果直接使用getClass等方法,會出現(xiàn)下面的情況

這個是獲取不到類型的
但是換成下面的方式,便可以獲?。菏褂孟逻呥@組大括號,這一點非常重要

換一種類型,一樣的情況

所以,可以通過上面的方式去獲取類型

上面的這種方法的思路為:利用子類實現(xiàn)父類的泛型是可以的
通過獲取第一個元素去判斷當(dāng)前屬于哪一種類型即可
很多情況下,按下面的思路去操作即可
public static void main(String[] args) {
List<String> strs = new ArrayList<>();
strs.add("xxx");
List<Integer> ins = new ArrayList<>();
ins.add(1);
List<Boolean> boos = new ArrayList<>();
boos.add(true);
List<Long> lons = new ArrayList<>();
lons.add(null);
System.out.println(((List<?>)strs).get(0) instanceof String);//true
System.out.println(((List<?>)ins).get(0) instanceof String);//false
System.out.println(((List<?>)boos).get(0) instanceof Boolean);//true
System.out.println(((List<?>)lons).get(0) instanceof Long);//false
}其他的直接去判斷,通過查找并嘗試,沒有找到符合我要求的,怎么通過上面的方法去暫時實現(xiàn)了
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于java.util.Random的實現(xiàn)原理詳解
Java實用工具類庫中的類java.util.Random提供了產(chǎn)生各種類型隨機數(shù)的方法,下面這篇文章主要給大家介紹了關(guān)于java.util.Random實現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2017-08-08
JAVA線程池監(jiān)控以及動態(tài)調(diào)整示例詳解
這篇文章主要為大家介紹了JAVA線程池監(jiān)控以及動態(tài)調(diào)整示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計中使用Redis實現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價值,需要的朋友可以參考下2018-11-11
Spring?Initializr只能創(chuàng)建為Java?17版本以上的問題解決
這篇文章主要給大家介紹了關(guān)于Spring?Initializr只能創(chuàng)建為Java?17版本以上問題的解決辦法,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01

