问题背景:封装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 这个类型; |
网友评论