下面集合在没有加泛型的类型时添加元素, 集合可以加任何类型的元素,
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个位置的元素, 就可打印出刚才添加进来的字符串。
|