美文网首页
Java获取泛型

Java获取泛型

作者: iblade_wang | 来源:发表于2021-12-03 11:46 被阅读0次

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

    获取泛型常用方法如下:

        /**
         * 获取对象的泛型
         *
         * @param src 待获取泛型对象
         * @param index   泛型的位置
         * @param <T> 泛型
         * @return 泛型Class类
         */
        public static <T> 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<T>) types[index];
                        return desClass;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    

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

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

    打印结果竟然是instance_1 = null

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

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

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

            Person<String> person1 = new Person<String>() {
                //这里写个空实现,佯装是个接口
            };
            Fruit<Integer, Float, Long> fruit = new Fruit<Integer, Float, Long>() {
            };
            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<T, P, D> {
            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<T> {
    }
    public class Programmer extends Person<String> {
    }
    /**
     * @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<java.lang.String>
    

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

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

    相关文章

      网友评论

          本文标题:Java获取泛型

          本文链接:https://www.haomeiwen.com/subject/xwfuxrtx.html