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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡文彬 中级黑马   /  2014-3-11 15:58  /  699 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡文彬 于 2014-3-12 22:19 编辑

下面是代码
public static void main(String[] args) throws Exception {
                        ArrayList<String> lists = new ArrayList<String>();
                        lists.add("wei");
                        lists.add("xiaoming");
                        lists.getClass().getMethod("add",Object.class).invoke(lists,3);
                        System.out.println(lists.get(2));
                        
                        ArrayList<Integer> collection = new ArrayList<Integer>();
                        collection.add(1);
                        collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
                        System.out.println(collection.get(1));
                        
                }
为什么我不能将Integer类型的数据加到String类型的集合中去呢?
将String类型的数据却可以顺利加入到Integer类型的集合中呢?
问题出在哪里呢?????

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

1 个回复

倒序浏览
这是由于System.out.println()方法的原因。
  1. ArrayList<String> lists = new ArrayList<String>();
  2.         lists.add("wei");
  3.         lists.add("xiaoming");
  4.         lists.getClass().getMethod("add",Object.class).invoke(lists,3);
  5.         lists.get(2);
  6.         System.out.println(lists.get(2));
复制代码

这段代码里,给System.out.println()放入的是一个String,我们来看看源码:
  1. public void println(String x) {
  2.         synchronized (this) {
  3.             print(x);
  4.             newLine();
  5.         }
  6.     }
复制代码
所以这里会把实际的类型当做了String,可是实际类型是Integer,会进行一个强转。导致了ClassCastException。

再来看第二段代码:
  1. ArrayList<Integer> collection = new ArrayList<Integer>();
  2.         collection.add(1);
  3.         collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
  4.         System.out.println(collection.get(1));
复制代码
这段代码里给System.out.println()放的是一个Integer,我们看看源码:
  1.     public void println(Object x) {
  2.         String s = String.valueOf(x);
  3.         synchronized (this) {
  4.             print(s);
  5.             newLine();
  6.         }
  7.     }
复制代码
  1. public static String valueOf(Object obj) {
  2.         return (obj == null) ? "null" : obj.toString();
  3.     }
复制代码
这里把Integer当做一个对象,然后调用String.valueOf()方法去把Integer转成一个String了,显然这里没有进行强制转换。

所以出错的原因就是第一段代码进行了强转,而第二段代码没有进行强转。所以第一段代码出错,而第二段代码正常。




评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马