行业知识
Java如何获取泛型类型
2026-10-25 19:41:00
来源:互联网转载
泛型(Generic)
泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic .NET 称之为泛型(generics);ML、Scala 和 Haskell 称之为参数多态(parametric polymorphism);C++ 和 D称之为模板。具有广泛影响的1994年版的《Design Patterns》一书称之为参数化类型(parameterized type)。
泛型定义及目的
泛型的定义主要有以下两种:
- 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
- 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)
不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。
泛型类、泛型接口、泛型方法可参考链接:泛型
通配符
数组类型(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 { } private static class Clazz extends SuperClass { } /** * 通过 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的几个接口子类讲解