Java获取泛型的class类型

项目中使用一个工具类,需要传入类的class来确定返回的结果类型,比如:

public <T> convert(Object obj,Class<T> t){

.......

}

类似这种格式

 然后我想传入一个类型比如:List<String>的class,但是不能直接写List<String>.class,如果需要获取泛型的class那么定义一个工具来解决。

具体思路是通过反射来获取类上边定义的泛型信息,为了使整个工具通用,设计一个抽象类并且声明泛型,由子类来传入泛型类型,再通过反射获取。

完整的工具类

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class TypeReference<T> {
    private final Type type;

    protected TypeReference() {
        Class<?> parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(this.getClass());
        Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType)type;
        this.type = parameterizedType.getActualTypeArguments()[0];
    }

    public Type getType() {
        return this.type;
    }

    public boolean equals(Object obj) {
        return this == obj || obj instanceof TypeReference && this.type.equals(((TypeReference)obj).type);
    }

    public int hashCode() {
        return this.type.hashCode();
    }

    public String toString() {
        return "TypeReference<" + this.type + ">";
    }

    private static Class<?> findParameterizedTypeReferenceSubclass(Class<?> child) {
        Class<?> parent = child.getSuperclass();
        if (Object.class == parent) {
            throw new IllegalStateException("Expected TypeReference superclass");
        } else {
            return TypeReference.class == parent ? child : findParameterizedTypeReferenceSubclass(parent);
        }
    }

TypeReference是一个抽象类,所以需要子类来继承,一般是直接使用匿名内部类的方式

 TypeReference<String> typeReference = new TypeReference<String>() {
匿名内部类
        };

typeReference.getType(); // 获取泛型class类型

在构造器中通过反射来拿到泛型的类型 

protected TypeReference() {
// 拿到当前的匿名类的class对象
        Class<?> parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(this.getClass());
// 再获取匿名类的父类,也就是TypeReference的类型信息
        Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType)type;
// 再去取得当前的泛型类型,比如 TypeReference<String> tf = new TypeReference();
// 获取的就是String的类型信息
        this.type = parameterizedType.getActualTypeArguments()[0];
    }

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,由于泛型类型信息在运行时会被擦除,所以无法直接通过泛型参数获取泛型class。不过,你可以通过一些技巧来获取泛型class。以下是两种常用的方法: 方法一:通过构造函数参数获取 ```java import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericClass<T> { private Class<T> clazz; public GenericClass() { Type type = getClass().getGenericSuperclass(); ParameterizedType parameterizedType = (ParameterizedType) type; this.clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0]; } public Class<T> getGenericType() { return clazz; } } ``` 你可以通过继承 `GenericClass` 并指定具体的泛型类型获取泛型class。例如: ```java public class MyClass extends GenericClass<String> { // ... } public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); Class<String> genericType = myClass.getGenericType(); System.out.println(genericType); // 输出:class java.lang.String } } ``` 方法二:通过传入 Class 对象获取 ```java public class GenericClass<T> { private Class<T> clazz; public GenericClass(Class<T> clazz) { this.clazz = clazz; } public Class<T> getGenericType() { return clazz; } } ``` 你可以直接在创建 `GenericClass` 对象时传入泛型class。例如: ```java public class Main { public static void main(String[] args) { GenericClass<String> genericClass = new GenericClass<>(String.class); Class<String> genericType = genericClass.getGenericType(); System.out.println(genericType); // 输出:class java.lang.String } } ``` 这两种方法都可以在运行时获取泛型class。请根据你的需求选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值