java如何获取泛型的类型
获取泛型类型的方法
在Java中,由于类型擦除(Type Erasure)机制,运行时无法直接获取泛型的实际类型参数。但可以通过以下方法间接实现:
通过子类继承获取泛型类型
定义一个带有泛型的父类,子类继承时指定具体类型,通过反射获取父类的泛型类型:

public abstract class GenericClass<T> {
private final Class<T> type;
public GenericClass() {
this.type = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getType() {
return type;
}
}
// 使用时
public class StringClass extends GenericClass<String> {}
StringClass stringClass = new StringClass();
Class<?> type = stringClass.getType(); // 返回String.class
通过方法参数获取泛型类型
利用方法的泛型参数,通过反射获取ParameterizedType:

public <T> void genericMethod(T param) {
Type type = ((ParameterizedType) getClass()
.getDeclaredMethod("genericMethod", Object.class)
.getGenericParameterTypes()[0];
// 处理type
}
使用匿名内部类
通过创建匿名内部类并指定具体类型,利用反射获取泛型信息:
List<String> list = new ArrayList<String>() {};
Type type = ((ParameterizedType) list.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
使用TypeToken(Guava/Gson)
第三方库如Guava或Gson提供TypeToken工具类:
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() {};
Type type = typeToken.getType(); // 获取完整泛型类型
注意事项
- 以上方法均依赖于在编译时保留部分泛型信息(通过类继承或匿名类)
- 直接声明的变量如
List<String> list = new ArrayList<>()无法获取泛型类型 - 类型擦除后运行时泛型信息会丢失,需通过特定方式保留
选择哪种方法取决于具体场景,子类继承和TypeToken是较常用的方案。






