首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于泛型和反射的一个有关问题

2013-08-14 
关于泛型和反射的一个问题有如下代码片段 1ArrayListString collection2 new ArrayListString()2co

关于泛型和反射的一个问题
有如下代码片段
 
1  ArrayList<String> collection2 = new ArrayList<String>();
2   collection2.add("abc");
3   collection2.getClass().getMethod("add", Object.class).invoke(collection2,  
4                                                                   new  Integer(48));
5   Object obj=collection2.get(1);
6   System.out.println(obj.getClass().getName());
7 // System.out.println(collection2.get(1).getClass().getName());

第7行不注释掉时会出现ClassCastException,但是如果按照第5、6行这样写又可以顺利通过编译并正常显示java.lang.Integer
在此想请教各位java大神这样分开写和合着写的区别何在,以及为什么分开写就不会出现异常。
 先谢谢各位大神,纠结了很久了,还是想不通 Java 泛型 ArrayList String 对象
[解决办法]
泛型定义是给编译器看的,反射会绕过泛型检查。
[解决办法]
collection2 中的第一个对象时Integer类型,而定义的泛型是String类型,它默认转为String,当然会出现cast异常了。
6.7行代码 你先向上转成object类型了,所以没问题。
[解决办法]

引用:
Quote: 引用:

编译器会把这段代码改成
System.out.println(Class(? extends String)collection2.get(1).getClass().getName());
猜测是这样,字节码里其实会对collection2.get(1)进行一次cast

 113: getstatic       #68; //Field java/lang/System.out:Ljava/io/PrintStream;
 116: aload_1
 117: iconst_1
 118: invokevirtual   #64; //Method java/util/ArrayList.get:(I)Ljava/lang/Object;
 121: checkcast       #84; //class java/lang/String
 124: invokevirtual   #25; //Method java/lang/Object.getClass:()Ljava/lang/Class;


 127: invokevirtual   #86; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V



那么我在进行Object obj=collection2.get(1);的时候为什么没有cast,真心求解


你的line 5 做了一次强转,其实可以写成这样
String str = collection2.get(1);
Object obj = str;

collection2.get(1)返回的是一个泛型指定的String类型变量,
Object obj = collection2.get(1);
就是把String类型向上强转为Object类型,Integer是Obj的子类,所以obj.getClass()就没有类型歧义了。

如果是collection2.get(1).getClass(),就相当于
String str = collection2.get(1); 
str.getClass();
这里的str指向的是Integer类型实例,而String和Integer类型没有继承关系,所以str.getClass()就报错

热点排行