Java获取泛型

问题背景:封装Glide 4.12 图片下载监听泛型有多种,Bitmap,Drawable,GifDrawable,File,期望通过Listener对象拿到Bitmap泛型。

获取泛型常用方法如下:

    /**
     * 获取对象的泛型
     *
     * @param src 待获取泛型对象
     * @param index   泛型的位置
     * @param  泛型
     * @return 泛型Class类
     */
    public static  Class getInstance(Object src, int index) {
        if (src == null || index < 0) {
            return null;
        }
        Class aClass = src.getClass();
        Type gSuperclass = aClass.getGenericSuperclass();
        if (gSuperclass instanceof ParameterizedType) {
            try {
                ParameterizedType pType = (ParameterizedType) gSuperclass;
                Type[] types = pType.getActualTypeArguments();
                if (index < types.length) {
                    Class desClass = (Class) types[index];
                    return desClass;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

依据上述方法测试下效果:

    public static void main(String[] args) {
        Person person1 = new Person();
        //就一个泛型 故获取0位 即可。
        Class instance1 = getInstance(person1, 0);
        System.out.println("instance_1 = " + instance1);
    }

    public static class Person {
        private T data;
    }

打印结果竟然是instance_1 = null

泛型通常使用在接口或者抽象类里,模拟抽象类加个实现{ },修改后如下

    public static void main(String[] args) {
        Person person1 = new Person() {
        //这里写个空实现,佯装是个接口
        };
        //就一个泛型 故获取0位 即可。
        Class instance1 = getInstance(person1, 0);
        System.out.println("instance_1 = " + instance1);
    }

打印结果就正常了。instance_1 = class java.lang.String
接下来测试下index 是否可用。

        Person person1 = new Person() {
            //这里写个空实现,佯装是个接口
        };
        Fruit fruit = new Fruit() {
        };
        Class instance1 = getInstance(person1, 0);
        System.out.println("instance_1 = " + instance1);
        Class fInstance0 = getInstance(fruit, 0);
        Class fInstance2 = getInstance(fruit, 2);
        System.out.println("\nfInstance0 = " + fInstance0 + "\nfInstance2 = " + fInstance2);
    }

    public static class Fruit {
        private T time;
        private P price;
        private D distance;
    }

结果如下:

instance_1 = class java.lang.String

fInstance0 = class java.lang.Integer
fInstance2 = class java.lang.Long

什么是getGenericSuperClass?和getSuperClass什么区别?
结论:①getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)
② getGenericSuperclass 返回直接继承的父类(包含泛型参数)


getSuperclass和getGenericSuperclass区别

代码测试:

public class Person {
}
public class Programmer extends Person {
}
/**
 * @description :
 * Created by @author YongliangWang on 2021/12/02 18:02
 */
public class Test {
    public static void main(String[] args) {
        printLn(Test.class);
        printLn(Person.class);
        printLn(Programmer.class);
    }

    private static void printLn(Class clazz) {
        String name = clazz.getSimpleName();
        Class superClz = clazz.getSuperclass();
        Type genericClz = clazz.getGenericSuperclass();
        System.out.println("\n" + name + "\n getSuperclass() = " + superClz + "\n getGenericSuperclass() = " + genericClz);
    }

}

打印结果

Test
 getSuperclass() = class java.lang.Object
 getGenericSuperclass() = class java.lang.Object

Person
 getSuperclass() = class java.lang.Object
 getGenericSuperclass() = class java.lang.Object

Programmer
 getSuperclass() = class iblade.Person
 getGenericSuperclass() = iblade.Person

另外:isInstance作为Class一个方法, 也可以做类型判断,A.class.isInstance(a)。

操作 instanceOf isInstance
属性 Java 中的一个操作符 Class 类的一个方法
使用方法 obj instanceof class; A.class.isInstance(obj);
解释 这个 obj 是不是 class 这种类型; 这个对象 obj 能不能被强制转化为 A 这个类型;

你可能感兴趣的:(Java获取泛型)