一、泛型类
class GenericType {
private T data;
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
二、获取泛型类的真实泛型
//这种方式定义泛型变量,要想通过操作appleGenericType.getClass()是无法获取到泛型的真实类型的
//因为在运行的时候泛型类中的泛型已经被擦除了
GenericType appleGenericType = new GenericType();
2.1 方式一
GenericType appleGenericType = new GenericType();
appleGenericType.setData(new Apple());
Method method = appleGenericType.getClass().getMethod("getData");
Object invoke = method.invoke(appleGenericType);
System.out.println(invoke.getClass());//class generically.Apple
2.1 方式二
GenericType appleGenericType = new GenericType(){};
Class extends GenericType> appleGenericTypeClass = appleGenericType.getClass();
Type appleGenericSuperclass = appleGenericTypeClass.getGenericSuperclass();
System.out.println(((ParameterizedType)appleGenericSuperclass).getRawType()); //class generically.GenericType
System.out.println(appleGenericSuperclass.getTypeName());//generically.GenericType
System.out.println(((ParameterizedType)appleGenericSuperclass).getActualTypeArguments()[0]);//class generically.Apple
三、获取接口方法返回值里面的真实泛型
3.1 接口
interface ReturnType{
GenericType getApple();
}
3.2 获取真实类型
Method getAppleMethod = ReturnType.class.getMethod("getApple");
Type genericReturnType = getAppleMethod.getGenericReturnType();
System.out.println(genericReturnType);//generically.GenericType
System.out.println(genericReturnType instanceof ParameterizedType); //true
ParameterizedType parameterizedType = (ParameterizedType) genericReturnType;
System.out.println(parameterizedType.getActualTypeArguments()[0]); //class generically.Apple
System.out.println(parameterizedType.getOwnerType()); //null
System.out.println(parameterizedType.getRawType());//class generically.GenericType
System.out.println(parameterizedType.getTypeName());//generically.GenericType
四、获取ArrayList集合的真实泛型
List arrayList = new ArrayList(){};
Type type = arrayList.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
System.out.println((parameterizedType.getActualTypeArguments()[0]).getTypeName()); // java.lang.Integer
五、操作集合
ArrayList stringArrayList = new ArrayList<>();
stringArrayList.add("苹果");
stringArrayList.add("凤梨");
stringArrayList.add("香蕉");
Class extends ArrayList> stringArrayListClass = stringArrayList.getClass();
Method addMethod = stringArrayListClass.getMethod("add", Object.class);
//通过反射给集合添加元素,这种调用方式又进一步证明了泛型的擦除
addMethod.invoke(stringArrayList,new int[]{1,2,3});
System.out.println(stringArrayList);
for (int i = 0; i < stringArrayList.size(); i++) {
Object object = stringArrayList.get(i);
if(object.getClass().getTypeName().equals(String.class.getTypeName())){
System.out.println(object);
}else if(object.getClass().getTypeName().equals(int[].class.getTypeName())){
System.out.println(object);
}
}