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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 衣带赞 中级黑马   /  2013-11-21 14:45  /  1508 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 衣带赞 于 2013-11-21 14:48 编辑

因为集合的泛型只作用于编译时期,所以可以通过 .class 文件的反射方式往ArrayList<E>中加入不是<E>的类型参数,但是这里出了个小问题,大家帮忙看看。
  1. package cn.itcast.day2;

  2. import java.util.ArrayList;

  3. public class MethodTest {

  4.         public static void main(String[] args) throws Exception{
  5.                
  6.                 ArrayList<Integer> al1 = new ArrayList<Integer>();
  7.                 ArrayList<String> al2 = new ArrayList<String>();
  8.                
  9.                 al1.add(123);
  10.                 al2.add("abc");
  11.                
  12.                 al1.getClass().getMethod("add", Object.class).invoke(al1, "gg");
  13.                 System.out.println(al1);
  14.                 System.out.println(al1.get(1));
  15.                
  16.                 al2.getClass().getMethod("add", Object.class).invoke(al2,888);
  17.                 System.out.println(al2);
  18.                 System.out.println(al2.get(1));

  19.         }

  20. }
复制代码
这个运行的结果是
  1. [123, gg]
  2. gg
  3. [abc, 888]
  4. Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  5.         at cn.itcast.day2.MethodTest.main(MethodTest.java:21)
复制代码
System.out.println(al2.get(1));
这句话执行错误了,而且从打印集合的结果来看,明显已经把888加入了al2中,但是无法打印出来,这是什么原因?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

4 个回复

倒序浏览
你al2指定是string而你存入的int   取出时涉及到了提升

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
亲,你的代码出现的异常为ClassCastException。类型转换异常。也就是通常说的类型不匹配。
System.out.println(al2.get(0));这里改动一下就可以了,还有,下次写代码记得加注释,看起来真的很费劲
还有,这道题你到底要做什么总要说吧?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
这个问题楼主主要是想表达为什么类型参数是Integer的集合,通过反射加入字符串可以成功的输出,而类型参数是String的集合,通过反射加入Integer就会出现ClassCastException。
我看了一下,类型参数是其他的都可以成功的通过反射加入其他类型的数据,唯独类型参数是String的集合,通过反射加入其他类型的数据会出现类型转换异常
楼上说的String中存入int,本身反射中不涉及到类型参数,而且就算普通的String中存入int,虽然编译错误,但也应该是说String中存入Integer,集合类不能存入基本类型数据,会做一个装箱动作,自动将基本类型转换成包装类
回复 使用道具 举报
freehiker 发表于 2013-11-22 11:51
这个问题楼主主要是想表达为什么类型参数是Integer的集合,通过反射加入字符串可以成功的输出,而类型参数 ...

对的,我就是这个意思,正如你所说,这个转换异常让我很惊讶,我试过自己写一个类加入String中,并覆盖了类中的toString方法,结果也是不能输出。不是int数据类型的问题,这个原理我也不清楚,根本就找不到解释,我也很困惑。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马