Java如何獲取泛型類型

泛型(Generic)

泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型。各種程序設計語言和其編譯器、運行環境對泛型的支持均不一樣。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic .NET 稱之為泛型(generics);ML、Scala 和 Haskell 稱之為參數多態(parametric polymorphism);C++ 和 D稱之為模板。具有廣泛影響的1994年版的《Design Patterns》一書稱之為參數化類型(parameterized type)。

泛型定義及目的

泛型的定義主要有以下兩種:

  1. 在程序編碼中一些包含類型參數的類型,也就是說泛型的參數只可以代表類,不能代表個別對象。(這是當今較常見的定義)
  2. 在程序編碼中一些包含參數的類。其參數可以代表類或對象等等。(現在人們大多把這稱作模板)

不論使用哪個定義,泛型的參數在真正使用泛型時都必須作出指明。
一些強類型程序語言支持泛型,其主要目的是加強類型安全及減少類轉換的次數,但一些支持泛型的程序語言只能達到部分目的。

泛型類、泛型接口、泛型方法可參考鏈接:泛型

如何獲取泛型類型

通過反射方式獲取

1)通過反射獲取父類對象的類型;
2)判斷是參數化類型還是Class類型,如果是Class類型則獲取父類的父類對象類型;
3)拿到參數化類型,獲取該類型中的泛型類型;

ParameterizedType是參數化類型,即帶有泛型的類型,比如List<String>、Set<Long>、Map<String, Long>、Class<Float>等類型;
其中它有三個方法

  • getActualTypeArguments():獲取該類型中的泛型類型;
  • getRawType():獲取對應的原始類型,比如List<String>類型的原始類型就是List
  • getOwnerType():獲取擁有者的類型,當該類型是內部類的時候,獲取外層類的類型,如果不是內部類則返回的都是null。
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class AccessGenericTypeDemo {static class SuperClass<T> {}/*** 強引用:  當一個對象被強引用變量引用時,它處于可達狀態,是不可能被垃圾回收器回收的,即使該對象永遠不會被用到也不會被回收。* 軟引用:  當系統內存充足時它不會被回收,當系統內存不足時它才會被回收。* 弱引用:  只要垃圾回收機制一運行,不管 JVM 的內存空間是否足夠,都會回收該對象占用的內存。* 虛引用:  在任何時候都可能被垃圾回收器回收,它不能單獨使用也不能通過它訪問對象,虛引用必須和引用隊列(RefenenceQueue)聯合使用。*/private static class Clazz extends SuperClass<ReferenceQueue> {}/*** 通過反射方式獲取父類泛型類型*/private static Type getSuperClassGenericType() {// 獲取當前對象的直接父類的類型Type type = Clazz.class.getGenericSuperclass();// ParameterizedType獲取 參數化類型 ,即平常所用到的泛型List<String>、Map<K,V>,Set<T>,Class<?> 數組類型(GenericArrayType)if (type instanceof ParameterizedType) {return ((ParameterizedType) type).getActualTypeArguments()[0];// 兩層繼承} else if (type instanceof Class) {type = ((Class<?>) type).getGenericSuperclass();return ((ParameterizedType) type).getActualTypeArguments()[0];} else {throw new ClassCastException("get class error,actual type is " + Clazz.class.getCanonicalName());}}public static void main(String[] args) {System.out.println(getSuperClassGenericType());}
}

通過Spring框架的ResolvableType獲取

官方文檔鏈接:docs.spring.io —— ResolvableType

import org.springframework.core.ResolvableType;import java.lang.ref.ReferenceQueue;
import java.lang.reflect.Type;public class AccessGenericTypeDemo {static class SuperClass<T> {}private static class Clazz extends SuperClass<ReferenceQueue> {}/*** 通過 org.springframework.core.ResolvableType 獲取父類對象** @return ResolvableType*/private static Type getResolvableType() {return ResolvableType.forClass(Clazz.class).getSuperType().getGeneric(0).resolve();}public static void main(String[] args) {System.out.println(getResolvableType());}
}

兩者獲取結果如下,
在這里插入圖片描述

擴展

上面Type類型的子類除了Class和ParameterizedType,還有GenericArrayType、TypeVariable、WildcardType,可參考:簡書_Type的幾個接口子類講解

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

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

相關文章

WPF樹形控件TreeView使用介紹

WPF 中的 TreeView 控件用于顯示層次結構數據。它是由可展開和可折疊的 TreeViewItem 節點組成的&#xff0c;這些節點可以無限嵌套以表示數據的層次。 TreeView 基本用法 例如實現下圖的效果&#xff1a; xaml代碼如下&#xff1a; <Window x:Class"TreeView01.Mai…

springcloud整合seata我踩過的坑

版本問題 seata 1.5和1.5之前的目錄結構不同,使用docker修改的配置文件也不同 1.4的左右 1.5之后docker 掛載文件也不同 1.5之前是使用自己寫的掛載registry docker run -d -p 8091:8091 -p 7091:7091 --network newlead --name seata-serve -e SEATA_IP192.168.249.132…

4:kotlin 方法(Functions)

想要聲明一個函數需要使用fun關鍵字 fun hello() {return println("Hello, world!") }fun main() {hello()// Hello, world! }格式: fun 方法名(參數1: 參數1類型, 參數2 : 參數2類型, ...): 返回值類型 {方法體return 返回值 }fun 方法名(參數1: 參數1類型, 參數2…

人工智能基礎_機器學習047_用邏輯回歸實現二分類以上的多分類_手寫代碼實現邏輯回歸OVR概率計算---人工智能工作筆記0087

然后我們再來看一下如何我們自己使用代碼實現邏輯回歸的,對二分類以上,比如三分類的概率計算 我們還是使用鶯尾花數據 首先我們把公式寫出來 def sigmoid(z): 定義出來這個函數 可以看看到這需要我們理解OVR是如何進行多分類的,我們先來看這個 OVR分類器 思想 OVR(One-vs-…

UE 進階篇一:動畫系統

導語: 下面的動畫部分功能比較全,可以參考這種實現方式,根據自己項目的顆粒度選擇部分功能參考,我們商業項目動畫部分也是這么實現的。 最后實現的效果如下: 最終效果 目錄: ------------------------------------------- 文末有視頻教程/工程地址鏈接 -------------…

9、鴻蒙應用桌面圖標外觀和國際化

一、項目資源目錄 項目下的resoueces目錄為資源配置目錄&#xff0c;其中base為基礎配置&#xff0c;即在任何語言環境下都會加載的資源&#xff0c; color.json&#xff1a;用于配置顏色&#xff0c;如頁面的背景和文字的顏色。 string.json&#xff1a;用于設置文字&#…

Selenium切換窗口、框架和彈出框window、ifame、alert

一、切換窗口 #獲取打開的多個窗口句柄 windows driver.window_handles #切換到當前最新打開的窗口 driver.switch_to.window(windows[-1]) #最大化瀏覽器 driver.maximize_window() #刷新當前頁面 driver.refresh() 二、切換框架frame 如存在以下網頁&#xff1a; <htm…

Java基礎(程序控制結構篇)

Java的程序控制結構與C語言一致&#xff0c;分為順序結構、選擇結構&#xff08;分支結構&#xff09;和循環結構三種。 一、順序結構 如果程序不包含選擇結構或是循環結構&#xff0c;那么程序中的語句就是順序的逐條執行&#xff0c;這就是順序結構。 import java.util.Sc…

【 OpenGauss源碼學習 —— 列存儲(CStoreMemAlloc)】

列存儲&#xff08;CStoreMemAlloc&#xff09; 概述CStoreMemAlloc 類CStoreMemAlloc::Palloc 函數CStoreMemAlloc::AllocPointerNode 函數CStoreMemAlloc::FreePointerNode 函數CStoreMemAlloc::Repalloc 函數CStoreMemAlloc::PfreeCStoreMemAlloc::Register 函數CStoreMemAl…

杭電oj 2064 漢諾塔III C語言

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

問鼎web服務

華子目錄 www簡介常見Web服務程序介紹&#xff1a;服務器主機主要數據瀏覽器網址及http介紹urlhttp請求方法 http協議請求的工作流程www服務器類型靜態網站動態網站 快速安裝Apache安裝準備工作httpd所需目錄主配置文件 實驗操作 www簡介 Web網絡服務也叫www&#xff08;world…

編碼的發展歷史

編碼的發展歷史 ASCII&#xff1a; ASCII編碼使用7位二進制數表示一個字符&#xff0c;范圍從0到127。每個字符都有一個唯一的ASCII碼值與之對應。例如&#xff0c;大寫字母"A"的ASCII碼是65&#xff0c;小寫字母"a"的ASCII碼是97。 ASCII字符集包括英文…

linux服務器安裝gitlab

一、安裝gitlab sudo yum install curl policycoreutils-python openssh-server openssh-clients sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --permanent --add-servicehttp curl https://packages.gitlab.com/install/repositories/gitla…

LabVIEW中將SMU信號連接到PXI背板觸發線

LabVIEW中將SMU信號連接到PXI背板觸發線 本文介紹如何將信號從PXI&#xff08;e&#xff09;SMU卡路由到PXI&#xff08;e&#xff09;機箱上的背板觸發線。該過程涉及使用NI-DCPowerVI將SMU信號導出到PXI_TRIG線上。 在繼續操作之前&#xff0c;請確保在開發PC上安裝了兼容版…

MySQL啟動MySQL8.0并指定配置文件

MySQL啟動MySQL8.0并指定配置文件 mkdir -p /mysql8hello/config ; mkdir -p /mysql8hello/data ; mkdir -p /mysql8hello/logs; mkdir -p /mysql8hello/conf; vim /mysql8hello/config/my.cnf; # 啟動報錯就修改成777&#xff0c;但是會提示風險 chmod 644 /mysql8hello/co…

d3dx9_43.dll缺失怎么辦?教你一分鐘修復d3dx9_43.dll丟失問題

今天&#xff0c;與大家分享關于“d3dx9_43.dll丟失的5個解決方法”的主題。在我們的日常生活和工作中&#xff0c;我們可能會遇到各種各樣的問題&#xff0c;而d3dx9_43.dll丟失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它為什么會丟失&#xff1f;又該…

【LeetCode刷題-鏈表】--25.K個一組翻轉鏈表

25.K個一組翻轉鏈表 思路&#xff1a; 把鏈表節點按照k個一組分組&#xff0c;可以使用一個指針head依次指向每組的頭節點&#xff0c;這個指針每次向前移動k步&#xff0c;直至鏈表結尾&#xff0c;對于每個分組&#xff0c; 先判斷它的長度是否大于等于k&#xff0c;若是&am…

什么是Zero-shot(零次學習)

1 Zero-shot介紹 Zero-shot學習&#xff08;ZSL&#xff09;是機器學習領域的一種先進方法&#xff0c;它旨在使模型能夠識別、分類或理解在訓練過程中未見過的類別或概念。這種學習方法對于解決現實世界中常見的長尾分布問題至關重要&#xff0c;即對于一些罕見或未知類別的樣…

商務俄語學習,柯橋基礎入門教學,千萬別小看俄語中的“что”

1、что до (чего) 至于 例&#xff1a; что до меня, то я не могу согласиться 至于我&#xff0c;我不能同意。 А что до зимовки... Ты приедешь в этом году? 說到冬天和過冬…你今年回來嗎…

在windows筆記本中安裝tensorflow1.13.2版本的gpu環境2

tensorflow1.13.2版本的gpu環境 看python-anacona的安裝只需要看1.1部分即可 目錄 1.1 Anaconda安裝 1.2 tensorflow-gpu安裝 1.3 python編譯器-pycharm安裝 1.1 Anaconda安裝 從鏡像源處下載anaconda&#xff0c;地址&#xff1a;Index of /anaconda/archive/ | 北京…