likes
comments
collection
share

Java 运行时获取泛型类泛型类型

作者站长头像
站长
· 阅读数 3

代码示例

由于Java泛型擦除的特点, 当我们使用泛型类Class时, 无法直接知道泛型T的类型. 此时可以借助Java反射中Class.getGenericSuperclass()来获取到子类具体实现时所使用的真实类型

public class TypeParent<T, R> {​

    private Class<T> mTClass;
    private Class<R> mRClass;

@SuppressWarnings("unchecked")
    public TypeParent() {        
        Type t = getClass().getGenericSuperclass();        
        System.out.println("getClass() == " + getClass());        
        System.out.println("getClass().getSuperclass() == " + getClass().getSuperclass());        
        System.out.println("getClass().getGenericSuperclass() == " + t);        
        Type firType = ((ParameterizedType) t).getActualTypeArguments()[0];        
        System.out.println("((ParameterizedType) t).getActualTypeArguments()[0] == " + firType);        
        Type secType = ((ParameterizedType) t).getActualTypeArguments()[1];        
        System.out.println("((ParameterizedType) t).getActualTypeArguments()[1] == " + secType);        
        try {
            mTClass = (Class<T>) firType;            
            mRClass = (Class<R>) secType;        
        } catch (ClassCastException e) {           
            e.printStackTrace();        
        }        
        System.out.println("getActualTypeArguments() length == " + ((ParameterizedType) t).getActualTypeArguments().length);    
    }​
}

此时TypeParent为泛型类分别申明了泛型类型T与R

子类实现

public class TypeSub extends TypeParent<Integer, String> {}

public class Main {        
    public static void main(String[] args) {
        new TypeClass();
    }
​}

运行结果:

getClass() == class TypeClass getClass().getSuperclass() == class TypeParent getClass().getGenericSuperclass() == TypeParent<java.lang.Integer, java.lang.String> ((ParameterizedType) t).getActualTypeArguments()[0] == class java.lang.Integer ((ParameterizedType) t).getActualTypeArguments()[1] == class java.lang.String

mTClass == class java.lang.Integer

mRClass == class java.lang.String

getActualTypeArguments() length == 2

解析

Type getGenericSuperclass()

返回当前类型父类的Type类. 若父类为泛型类则返回的为ParameterizedType 否则返回的为Class

Type[] getActualTypeArguments()

返回泛型类<>中的参数对应的Type类. 由此我们可以通过getActualTypeArguments()获取到的Type类型转化为泛型类型的Class类型