黑马程序员技术交流社区

标题: 增强for循环的问题 [打印本页]

作者: 刘辉    时间: 2013-3-21 21:59
标题: 增强for循环的问题
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循环时就出现错误了呢??

作者: fighting    时间: 2013-3-21 22:38
这个没有什么错误啊,只是因为没有泛型,
所有会出现一个类型转化的不安全操作
作者: 小路飞    时间: 2013-3-21 22:47
给你改了下,再看看吧!
你用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. }
复制代码

作者: 小路飞    时间: 2013-3-21 22:47
给你改了下,再看看吧!
你用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. }
复制代码

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


作者: 仉钰    时间: 2013-3-22 08:57
在使用增强for 循环时
//for(String key:arr){..}
在语法上已经告诉编译器 arr中是 String 类型  但是你的ArrayList没有加上泛型  此时编译器只知道ArrayList中是默认的Object 类型
2个类型不一样  编译不通过   
所以只要 定义ArrayList<String> 加上泛型  就可以正确执行了
或者修改 for(Object key:arr)    总之调整类型一样就可以
作者: 王龙涛    时间: 2013-3-22 09:40
谢洋 发表于 2013-3-22 00:09
这道题我好像昨见过,不知是不是你问的
在遍历集合时,增强for内部封装的是Iterator的取出方式,因为Iterato ...

学习了:)
作者: 王_强    时间: 2013-3-22 09:48
楼主,你好
对于你的问题,首先是要明白 根据报错的原因是对象类型转换异常
   //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>();
在申明集合时,我们就现在定义集合装入对象的类型,在编译时就会检查是否可以装入,一旦能编译装入,在运行时我们就可以不要强制装换了!
  
还有点小建议:
   现在一般在使用集合时,都会结合使用泛型!
  希望这些能给你帮助!
作者: 王龙涛    时间: 2013-3-22 09:57
高级for循环已经指定返回值类型为<String>,而ArrayList中默认的返回值类型为<Object>
造成了引用数据类型不明确,编译时就会出现不兼容类型的错误
只要在ArrayList类中定义<String>泛型,保持上下一致就OK了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2