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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chslzj 中级黑马   /  2013-7-7 11:41  /  1912 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 chslzj 于 2013-7-7 11:44 编辑

定义了一个ArrayList<String> 对象,通过反射绕过了编译器,传入一个Integer类型的值,输出时会抛异常。定义ArrayList<Integer>对象,通过反射绕过编译器,传入String类型的值,输出时却不会抛异常,这是为什么呢?
  1. /**
  2. *
  3. */
  4. package com.itheima.test;

  5. import java.util.ArrayList;
  6. import java.util.Vector;


  7. /**
  8. * @author Administrator
  9. *
  10. */
  11. public class GenericTest {
  12.         public static void main(String[] args) throws Exception{
  13.                 //数组定义的时候不能这样设置泛型
  14.                 //Vector<String> vectorList[]=new Vector<String>[10];
  15.                 Vector<String> vectorList=new Vector<String>();
  16.                 //这样定义了一个泛型,编译的时候只能加入String类型的数据
  17.                 ArrayList<String> collection1 = new ArrayList<String>();
  18.                 collection1.add("abc");
  19.                 //collection1.add(123); 123加不进去
  20.                 String element = collection1.get(0);        
  21.                 //在字节码里面是没有关于泛型的信息的,我们可以通过反射绕过泛型的设置
  22.                 ArrayList<Integer> collection2 = new ArrayList<Integer>();
  23.                 collection2.add(2);
  24.                 collection2.getClass().getMethod("add", Object.class).invoke(collection2, "abc");
  25.                 System.out.println(collection2.get(0));
  26.                 System.out.println(collection2.get(1));//Integer类型成功绕过编译器
  27.                 //这里就证明了字节码里面是没有泛型信息的
  28.                 System.out.println(collection1.getClass() == collection2.getClass());
  29.                 collection1.getClass().getMethod("add", Object.class).invoke(collection1, 99);
  30.                 System.out.println(collection1.get(0));
  31.                 System.out.println(collection1.get(1));//这里为什么就不行了呢?
  32.                
  33.         }

  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

8 个回复

正序浏览
我现在也遇到同样的问题,
回复 使用道具 举报
changweihua 发表于 2013-7-9 08:12
我个人觉得ArrayList内部的元素是以Object存储的,试下collection2.get(1).intValue()

这,我问的是为什么Collection<Integer> 里面放String类型的东西可以顺利取出来了,但是Collection<String>里面放Int类型的东西取不出来!!OK?
回复 使用道具 举报
chslzj 发表于 2013-7-8 17:52
现在讨论的不是怎么取的这个值,而是,为什么上面Integer 能取到,而String类型的却取不到 ...

我个人觉得ArrayList内部的元素是以Object存储的,试下collection2.get(1).intValue()
回复 使用道具 举报
changweihua 发表于 2013-7-8 11:05
可以试下String.valueOf(collection1.get(1))

现在讨论的不是怎么取的这个值,而是,为什么上面Integer 能取到,而String类型的却取不到
回复 使用道具 举报
可以试下String.valueOf(collection1.get(1))
回复 使用道具 举报
王靖远 发表于 2013-7-7 14:16
你的Colleciton带泛型,get方法就会识别泛型。你用反射获得get方法,然后再去get可能就不会报错了 你可以测 ...

如果是泛型的问题,为什么上面的Collection<Integer> 放String的没有错呢
回复 使用道具 举报
你的Colleciton带泛型,get方法就会识别泛型。你用反射获得get方法,然后再去get可能就不会报错了 你可以测试下 我也没试过
回复 使用道具 举报
报的异常是这个:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马