本帖最后由 徐帅 于 2012-12-1 16:32 编辑
在张老师的泛型中,验证泛型只是给编译器使用的,在生成字节码的时候会去泛型,并通过反射来验证了这一点,
但我在使用反射验证的时候,泛型限定为Integer时,通过反射存入字符串可以,但是当泛型限定为String时,存入int类型的
数据,会出现异常:java.lang.Integer cannot be cast to java.lang.String,不知道如何解释?请大侠帮忙看看- package cn.xushuai.test;
- import java.lang.reflect.Constructor;
- import java.util.ArrayList;
- public class Geniric {
- public static void main(String[] args) throws Exception{
- ArrayList collection = new ArrayList();
- collection.add(1);
- collection.add(1L);
- collection.add("abc");
- //int i = (Integer)collection.get(1);
-
- //反射中使用泛型
- Constructor<String> constructor = String.class.getConstructor(StringBuffer.class);
- String str = constructor.newInstance(new StringBuffer("abc"));//无需强转
- System.out.println(str.charAt(2));
-
- //验证泛型仅是给javac编译器使用的,编译生成的字节码会去掉泛型的类型信息
- ArrayList<Integer> collection2 = new ArrayList<Integer>();
- ArrayList<String> collection3 = new ArrayList<String>();
- System.out.println(collection2.getClass() == collection3.getClass()); //true
-
- //在Integer的泛型限定下,存入字符串
- collection2.getClass().getMethod("add", Object.class).invoke(collection2, "haha");
-
- //在String的泛型限定下,存入int
- collection3.getClass().getMethod("add", Object.class).invoke(collection3, 9090);
- System.out.println(collection2.get(0));//haha
- <font color="#ff0000"> System.out.println(collection3.get(0));//java.lang.Integer cannot be cast to java.lang.String</font>
-
- }
- }
复制代码 |