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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶子和大人 中级黑马   /  2015-10-27 22:04  /  679 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. <span style="font-size: 14px; line-height: 2.2em;">ArrayList<String> list=new ArrayList<String>();</span>
复制代码
上述代码是将集合转换成数组的代码,看上去没什么问题,编译也没问题,但是一执行就会:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
一开始我百思不得其解,为什么不能使用数组直接转型呢?编译上还是通过的。但是如下这么写就没问题了:
  1. ArrayList<String> list=new ArrayList<String>();
  2. String[] strings=new String[list.size()];
  3. for(int i=0,j=list.size();i<j;i++){
  4. strings[i]=list.get(i);
  5. }
复制代码

在第二段代码中我把得到的Object数组中的每一个都进行了强转,就可以得到我想要的结果。其实以上的现象可以通过java虚拟机的设计来解释,java允许向上和向下转型,数组也是对象,list.toArray()得到的类型是[Ljava.lang.Object,而String[]得到的类型是[Ljava.lang.String,前者向后者转型就是向下转型了,但是Object数组保存的也只是对内存中一段数据的首地址的引用,他并不能保证数组中所有的元素都是String类型,所以不能进行强转。
以上只是遇到的问题,我想不明白的是jdk1.5已经引入了泛型的概念了,list中存入的数据已经是安全的了,为什么toArray方法不能自动识别泛型,带着疑问我去看了api,api中还有一个方法——<T> T[] toArray(T[] a),看到这个我就明白了,原来是我的方法使用错了。
然后我将上述代码改为:
  1. ArrayList<String> list=new ArrayList<String>();
  2.                 list.add("iloveyou");
  3.                 list.add("haha");
  4.                 String[] strs = (String[])list.toArray(new String[list.size()]);//直接就生成了String[]
复制代码
这样就不会报错了,得到的数组也是和上面代码得到的一样。


3 个回复

倒序浏览
  1. ArrayList<String> list=new ArrayList<String>();
  2.                 list.add("iloveyou");
  3.                 list.add("haha");
  4.                 String[] strings=(String [])list.toArray();
复制代码

第一行的代码(为什么上传了格式会变成那样子)
回复 使用道具 举报
66666666666666
回复 使用道具 举报
kongminggg 来自手机 中级黑马 2015-10-27 22:55:58
板凳
感觉。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马