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)判断是参数化类型还是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的几个接口子类讲解
相关文章:
Java如何获取泛型类型
泛型(Generic) 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Vis…...
2023年【起重机械指挥】考试题及起重机械指挥找解析
题库来源:安全生产模拟考试一点通公众号小程序 起重机械指挥考试题考前必练!安全生产模拟考试一点通每个月更新起重机械指挥找解析题目及答案!多做几遍,其实通过起重机械指挥作业考试题库很简单。 1、【多选题】按照事故造成的人…...
【前端学java】Java中的接口和枚举概念(7)
theme: smartblue 往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类…...
P8611 [蓝桥杯 2014 省 AB] 蚂蚁感冒(模拟)
首先,我们自然而然的想到和 P1007独木桥 的机制是一样的, 我们只需要把蚂蚁的相遇并掉头视作互相穿过即可 标记向左,向右蚂蚁的数量 for (int i 0; i < num - 1; i){int temp 0;scanf("%d", &temp);// 向右移动if (tem…...
边缘计算是如何为元宇宙提供动力的?
构建元宇宙虚拟世界并不简单,也并不便宜,但是还是有许多大型公司正在转移大量资源来开发他们的元宇宙业务,当然大部分企业注意力都围绕着 VR 耳机、AR 眼镜、触觉手套和其他沉浸式虚拟现实体验所需的可穿戴硬件。虽然这种沉浸式的体验是最终结…...
优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验
一、项目背景 世博文化公园是上海的绿色新地标,是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目,世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等,被赋予…...
【DevOps】Git 图文详解(五):远程仓库
Git 图文详解(五):远程仓库 1.远程用户登录1.1 🔑 远程用户登录:HTTS1.2 🔑 远程用户登录:SSH 2.远程仓库指令 🔥3.推送 push / 拉取 pull4.fetch 与 pull 有什么不同 ? …...
如果在手机没有root的情况下完成安卓手机数据恢复
您是否不小心从安卓设备中删除了重要数据? 担心如何取回您的照片、视频和文档? 有时您可能会不小心删除重要数据并使用安卓 root方法取回文件。 许多用户不喜欢根植他们的安卓设备,因为这是一种复杂的方法。 在本指南中,我们将向您…...
C++学习 --stack
目录 1, 什么是stack 2, 创建stack 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作stack 3-1, 赋值 3-2, 插入元素(push) 3-3, 查询元素 3…...
简单但好用:4种Selenium截图方法了解一下!
前言 我们执行UI自动化操作时,大多数时间都是不在现场的,出现错误时,没有办法第一时间查看到,这时我们可以通过截图当时出错的场景保存下来,后面进行查看报错的原因,Selenium中提供了几种截图的方法&#x…...
【报错记录】解决使用Kotlin写的SpringBoot项目使用Aspect切面无法生效的问题
前言 为了能在SpringBoot使用Kotlin,真的是各种坑都彩礼一遍,这次遇到的问题是Aspect无法对Kotlin代码生效。我这里的使用场景是使用切面切Controller中的方法,用来对接口进行一些初始化和收尾工作。 Aspect在Controller类还是Java代码的时…...
在python中分别利用numpy,tensorflow,pytorch实现数据的增加维度(升维),减少维度(降维)
文章目录 前言一、使用numpy实现升维度,降维度二、使用TensorFlow实现升维度,降维度三、使用PyTorch实现升维度,降维度总结 前言 我们明确一下升维和降维的概念: 升维(Dimensionality Augmentation)&…...
基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码
基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…...
Flutter的Event Loop
Flutter 的事件循环机制是其框架的核心部分,它负责管理事件的处理和UI的渲染。了解这个机制对于开发高效且响应迅速的Flutter应用非常重要。以下是Flutter事件循环的主要组成部分和工作原理: 1. 主事件循环(Main Event Loop) 当…...
HarmonyOS ArkTSTabs组件的使用(六)
Tabs组件的使用 ArkUI开发框架提供了一种页签容器组件Tabs,开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样,不同的页面设计页签不一样,可以把页签设置在底部、顶部或者侧边。 Tabs组件的简单使用 Tabs组件…...
【MetaLearning】有关Pytorch的元学习库higher的基本用法
【MetaLearning】有关Pytorch的元学习库higher的基本用法 文章目录 【MetaLearning】有关Pytorch的元学习库higher的基本用法1. 基本介绍2. Toy ExampleReference 1. 基本介绍 higher.innerloop_ctx是higher库的上下文管理器,用于创建内部循环(inner lo…...
火山引擎 ByteHouse 的增强型数据导入技术实践
作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。 数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。…...
依赖库:Ceres-solver-2.0.0安装
依赖库:Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中…...
LeSS敏捷框架高效生产力实践
每个团队可能都有一套适合自己的敏捷方法,本文介绍了ResponseTap工程团队通过采用LeSS框架、引入准备周,从而提升迭代冲刺研发效能的实践。原文: LeSS Agile, More Productive — Part 1: Pain[1], LeSS Agile, More Productive — Part 2: Promise, LeS…...
matlab绘图函数plot和fplot的区别
一、背景 有的函数用plot画就会报错,显示数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组。 如下图所示: 但用fplot函数就没有问题,因此这里记录一下两者的区别,如果使用不当,画出的图可能就是下…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
