java泛型的实质:仅作用于编译期
1. * 泛型的实质:仅作用于编译期,使用反射可以验证:MethodDemo2.java
package pers.li.reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
* create by luofeng on 2018-04-17 13:51
* 泛型的实质:仅作用于编译期,使用反射可以验证
*/
public class MethodDemo2 {
public static void main(String[] args) {
//1.申明两个集合,一个有泛型,一个无泛型
ArrayList arrayList=new ArrayList();
ArrayList<String> list=new ArrayList();
list.add("lisehngbo");
//获取类类型
Class<? extends ArrayList> c1 = arrayList.getClass();
Class<? extends ArrayList> c2 = list.getClass();
//因为类的类类型都为ArrayList,所以为true
System.out.println(c1==c2);
//反射操作都是在编译之后的
//c1=c2为true说明编译之后集合的泛型是去泛型化的
//java中集合的泛型是防止错误输入的,只在编译阶段有效 -- 绕过编译无效
//验证:通过方法反射操作便可以绕过编译
//ArrayList<String> list=new ArrayList();仅能存放String类型是因为泛型在编译期有效,若反射绕过编译,便都可以存放
Method m=null;
try {
m = c2.getMethod("add", Object.class);
//通过反射调用具有泛型的集合方法add整数类型和布尔类型,编译无报错,输出无报错
m.invoke(list,20);
m.invoke(list,true);
System.out.println(list.toString());
//不能使用以下遍历方式进行遍历,因为添加对象时,已经绕过泛型,有其他类型数据存在
/* for (String s:
list) {
System.out.println(s);
}*/
} catch (Exception e) {
e.printStackTrace();
}
}
}