A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simple_love 中级黑马   /  2013-10-3 13:35  /  1307 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面集合在没有加泛型的类型时添加元素, 集合可以加任何类型的元素,  
ArrayList collection1 = new ArrayList();
  collection1.add(1);
  collection1.add(1L);
  collection1.add("abc");
  //int i = (Integer)collection1.get(1);//运行出错。在获取元素时,返回值类型不能指定某一个具体的类型, 因为,集合中的元素根本就不知道某个具

// 体 的类型, 但是可以返回Object
  
//下面集合是加泛型类型,时,添加元素, 只能添加指定类型的元素。
  ArrayList<String> collection2 = new ArrayList<String>();
//下面两句编译报错,因为添加的元素不是指定String类型的元素,而泛型是提供给javac编译器使用的,
   可以限定程序在编译时非法输入,所以不能添加  
//collection2.add(1);
  //collection2.add(1L);
  collection2.add("abc");
  String element = collection2.get(0); //在获取某一个具体的元素时,返回值类型就是集合指定的类型
  
下面是用反射方式得到String对象的某一个构造函数构造函数,
  //new String(new StringBuffer("abc"));
获取String类的字节码的构造函数接收一个StringBuffer的字节码的参数,
  Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
在实例化String类时,传递一个StringBuffer的对象
  String str2 = constructor1.newInstance(new StringBuffer("abc"));
打印出String对象的某一个位置的具体的字符
  System.out.println(str2.charAt(2));  
  
下面用反射方式向集合添加元素
  ArrayList<Integer> collection3 = new ArrayList<Integer>();
// 判断集合类的字节码是否相同
  System.out.println(collection3.getClass() == collection2.getClass());
  //collection3.add("abc");不用反射向集合添加元素,由于上面限定元素的类型,所以不能添加字符串元素, 只能添加Integer类型元素
//通过反射的向集合添加元素,
collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
这时可以添加任何类型的元素,虽然集合 上加了泛型Integer类型,但是 getClass()方法的返回值和原始类型完全不一样
由于编译生成的字节码会去掉泛型的类型信息, 这时就会直接跳过编译器,进入运行状态,,
只要能跳过编译器,就可以往collection3集合中假如其他类型的数据。所有字符串“abc"就加入集合中
  System.out.println(collection3.get(0)+"==as");//获取集合中第0个位置的元素, 就可打印出刚才添加进来的字符串。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马