以下的内容需要一点点JAVA反射的知识,建议各位小伙伴可以先看一下我的浅析JAVA反射机制(如果实在不想看的话看懂下面的内容应该也不会有大问题,可能会有一点理解困难)。
我们先来看一个程序:
AyyayList<String> a = new ArrayList<String>();
a.add("hh");
a.add(20);
显而易见,a.add(20)是一个错误的操作,由此引出泛型的基本作用就是防止错误的输入。
再看这个程序:
AyyayList<String> a = new ArrayList<String>();
ArrayList b = new ArrayList();
a.add("hh");
Class c1 = a.getClass();
Class c2 = b.getClass();
各位小伙伴们猜一猜c1 == c2的结果是什么?
答案是true,为什么呢?因为所有反射的操作都是在运行时的,c1 == c2既然为true,那么就很好的证明了编译之后,程序会采取去泛型化的措施,也就是说JAVA中的泛型,只在编译阶段有效。
我们通过反射来进行验证(为了使逻辑清晰,去掉了异常处理):
AyyayList<String> a = new ArrayList<String>();
ArrayList b = new ArrayList();
a.add("hh");
Class c1 = a.getClass();
Class c2 = b.getClass();
Method me = a.getMethod("add",Object.class);
me.invoke(a,100);
System.out.println(a);
me.invoke(a,100);是正确的,因为绕过了编译阶段也就绕过了泛型,最后输出[hh,100]