JAVA中泛型的本质

来源:互联网 发布:妖夜慌踪 知乎 编辑:程序博客网 时间:2024/06/14 16:10

以下的内容需要一点点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]

1 0
原创粉丝点击