zoukankan      html  css  js  c++  java
  • 用反射来了解Java中泛型的本质

    这篇文章主要通过Class的Method来了解泛型的本质。

    先new 两个List,一个不加类型限制,另外一个限制类型为String:

    ArrayList list = new ArrayList();
    		
    ArrayList<String> list1 = new ArrayList<String>();

    根据我们的编程经验可以知道,list1.add("hello"),这是没有问题的,而list1.add(20),这是错误的,因为泛型限制了数据类型,这时候我们可以来看看list和list1的类类型,看看他们是否一致:

    Class c1 = list.getClass();
    Class c2 = list1.getClass();
    System.out.println(c1 == c2);

    可以得到结果为true,即c1=c2,我们知道,反射的操作是编译之后的操作,这说明编译之后集合的泛型是去泛型化的,由此,我们可以下一个结论:Java中集合的泛型,是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了,我可以通过方法的反射来操作,绕过编译:

    Method m = c1.getMethod("add", Object.class);
    m.invoke(list1, 100);
    System.out.println(list1.size());

    这时候我们看输出结果,size加了1,说明数据已经加进去了,由此证明:Java中集合的泛型,是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了,这个结论是正确的。

  • 相关阅读:
    关于git的文件内容冲突解决
    【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
    如何判断一个变量是不是指针
    类型识别
    C++中的异常处理(下)
    C++中的异常处理(中)
    C++中的异常处理(上)
    C语言异常处理
    用Zebra打造Linux下小型路由器
    Linux下PortSentry的配置
  • 原文地址:https://www.cnblogs.com/dengyulinBlog/p/6140234.html
Copyright © 2011-2022 走看看