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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘辉 中级黑马   /  2013-3-21 21:59  /  3025 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.ArrayList;

public class ArrayListTest {
        public static void main(String[] args) {
                ArrayList arr=new ArrayList();
                arr.add("123");
                arr.add("234");
                arr.add("345");
                for(int i=0;i<arr.size();i++){
                        String s=(String)arr.get(i);
                        System.out.println(s);
                }
                //for(String key:arr){
                        //System.out.println(key);
                //}
        }
}
//这里为啥我用普通for循环执行时就没问题,而用增强for循环时就出现错误了呢??

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-22 12:37

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
这个没有什么错误啊,只是因为没有泛型,
所有会出现一个类型转化的不安全操作

评分

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

查看全部评分

回复 使用道具 举报
给你改了下,再看看吧!
你用for增强时,没有强转导致错误!
  1. import java.util.ArrayList;

  2. public class ArrayListTest {
  3.         public static void main(String[] args) {
  4.                 ArrayList<String> arr=new ArrayList<String>();
  5.                 arr.add("123");
  6.                 arr.add("234");
  7.                 arr.add("345");
  8. //                for(int i=0;i<arr.size();i++){
  9. //                        String s = arr.get(i);
  10. //                        System.out.println(s);
  11. //                }
  12.                                   for(String key:arr){
  13.                                                 System.out.println(key);
  14.                                   }
  15.         }
  16. }
复制代码
回复 使用道具 举报
给你改了下,再看看吧!
你用for增强时,没有强转导致错误!
  1. import java.util.ArrayList;

  2. public class ArrayListTest {
  3.         public static void main(String[] args) {
  4.                 ArrayList<String> arr=new ArrayList<String>();
  5.                 arr.add("123");
  6.                 arr.add("234");
  7.                 arr.add("345");
  8. //                for(int i=0;i<arr.size();i++){
  9. //                        String s = arr.get(i);
  10. //                        System.out.println(s);
  11. //                }
  12.                                   for(String key:arr){
  13.                                                 System.out.println(key);
  14.                                   }
  15.         }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这道题我好像昨见过,不知是不是你问的
在遍历集合时,增强for内部封装的是Iterator的取出方式,因为Iterator是一个泛型类型,其中取出方法的原型为:E next()
在没有使用泛型的情况下,返回值类型为Object
for(String key:arr) 相当于String key=it.next();但next的返回值类型为Object

评分

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

查看全部评分

回复 使用道具 举报
在使用增强for 循环时
//for(String key:arr){..}
在语法上已经告诉编译器 arr中是 String 类型  但是你的ArrayList没有加上泛型  此时编译器只知道ArrayList中是默认的Object 类型
2个类型不一样  编译不通过   
所以只要 定义ArrayList<String> 加上泛型  就可以正确执行了
或者修改 for(Object key:arr)    总之调整类型一样就可以

评分

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

查看全部评分

回复 使用道具 举报
谢洋 发表于 2013-3-22 00:09
这道题我好像昨见过,不知是不是你问的
在遍历集合时,增强for内部封装的是Iterator的取出方式,因为Iterato ...

学习了:)
回复 使用道具 举报
楼主,你好
对于你的问题,首先是要明白 根据报错的原因是对象类型转换异常
   //for(String key:arr){
                        //System.out.println(key);
                //}
这是你的代码,因为你在申明arr时没有用到泛型,所以arr集合 就把所有的对象作object来装入,当然用for增强取出时,也就是object对象了,所有你要这样写
   //for(Object key:arr){
                      String str=(String)key;
                        //System.out.println(str);
                //}
另解:
或是用泛型:
   ArrayList<String> arr=new ArrayList<String>();
在申明集合时,我们就现在定义集合装入对象的类型,在编译时就会检查是否可以装入,一旦能编译装入,在运行时我们就可以不要强制装换了!
  
还有点小建议:
   现在一般在使用集合时,都会结合使用泛型!
  希望这些能给你帮助!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
高级for循环已经指定返回值类型为<String>,而ArrayList中默认的返回值类型为<Object>
造成了引用数据类型不明确,编译时就会出现不兼容类型的错误
只要在ArrayList类中定义<String>泛型,保持上下一致就OK了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马