黑马程序员技术交流社区

标题: 请大神帮我看一题 [打印本页]

作者: sunshine9091    时间: 2014-8-7 07:55
标题: 请大神帮我看一题
请看下面的代码,在while遍历里,为什么还要做String s = (String)it.next()呢,我存的本来就是字符串啊,怎么还要强转呢???


public static void main(String[] args)
        {
                ArrayList al = new ArrayList();

                al.add("abc356");
                al.add("abc3543");
                al.add("abc126");
                al.add("abc0897");

                Iterator it = al.iterator();
                while (it.hasNext())
                {
                        String s = (String)it.next();

                        System.out.println(s+"...."+s.length());
                }
               
        }
作者: 唕    时间: 2014-8-7 08:04
你把强转(String)去掉 看下报错 ,就明白了。集合里存的Object对象 赋值给String对象,要强转。编译时,谁知道你里面存的什么呀
作者: 草鱼狂飙    时间: 2014-8-7 08:11
你存入是字符串,但是存入arraylist之后变为object,再次取出后就是object,肯定需要强制转换;
arraylist中的元素都是以object存储的吧。
作者: masai158    时间: 2014-8-7 08:29
集合没有指定泛型,所以存入的都是Object,所以OBject要强转
作者: Bule丶    时间: 2014-8-7 08:55
加上泛型就好了,集合不加泛型存进去会自动装箱,变成Object,在你取的时候不会自动拆箱,要手动去强转成String才能赋值,除非你直接输出
作者: a191170796    时间: 2014-8-7 09:01
import java.util.*;


public class Test_1 {

        public static void main(String[] args)
        {
                ArrayList<String> a1 = new ArrayList<String>();
                a1.add("abc123");
                a1.add("abc456");
                a1.add("abc789");
                for(Iterator<String> it=a1.iterator();it.hasNext();)//在此声明String类型
                {
                        String s = it.next();
                        System.out.println(s+"...."+s.length());
                }
        }

}
这样就不用强转了。
作者: 李章敏    时间: 2014-8-7 09:14
集合里存的Object对象 赋值给String对象,要强转
作者: blue_sky    时间: 2014-8-7 09:15
加入泛型,一切搞定。。。。。
作者: zhxu188    时间: 2014-8-7 09:26
给编译器看的
作者: sunshine9091    时间: 2014-8-7 09:29
李章敏 发表于 2014-8-7 09:14
集合里存的Object对象 赋值给String对象,要强转

嗯,现在明白了!
作者: 朱道研    时间: 2014-8-7 09:35
如果你用eclipse编写一下。就可以看到.后弹出的提示里。it.next返回的是Object
作者: 李文方    时间: 2014-8-7 09:38
你知道,并不代表编译器就知道啊,它只按规矩办事,it.next()返回的是Object类型,而你需要的是String 类型,所以需要强转
作者: 玥夜    时间: 2014-8-7 09:55
顶顶顶顶
作者: rckdong    时间: 2014-8-7 10:31
看看了评论,学习了
作者: Hey丶小黑    时间: 2014-8-7 11:08
李文方 发表于 2014-8-7 09:38
你知道,并不代表编译器就知道啊,它只按规矩办事,it.next()返回的是Object类型,而你需要的是String 类型 ...

哎呀,这位美女,你要进哪期呀,无情搭讪。

作者: 渴望学习    时间: 2014-8-7 11:21
路过~~~   
作者: 叶飞翔    时间: 2014-8-7 11:29
草鱼狂飙 发表于 2014-8-7 08:11
你存入是字符串,但是存入arraylist之后变为object,再次取出后就是object,肯定需要强制转换;
arraylist ...

嗯嗯,说的很对,就是这样的。
作者: 周峰峰    时间: 2014-8-7 11:41
List里面取出的都Object类型,你直接赋值给String类型,肯定不行,得强制转换
作者: 叶飞翔    时间: 2014-8-7 11:53
Hey丶小黑 发表于 2014-8-7 11:08
哎呀,这位美女,你要进哪期呀,无情搭讪。

哈哈哈哈。。。
作者: F@C    时间: 2014-8-7 14:45
进来学习

作者: Ezreal    时间: 2014-8-7 16:34
Object obj = it.next();
String s = (String)obj;
遍历传回的是Object,肯定要向下转型
作者: GoodBoy123    时间: 2014-8-7 16:41
说白了就是你没加泛型
作者: 18334705181    时间: 2014-8-7 17:17
我的建议是把强转(String)去掉,应该就差不多了
作者: 曾宇    时间: 2014-8-7 17:27
因为
Iterator it = al.iterator();//这句话it现在是Object类型
所以下面使用到it的时候,需要强制类型转换成String类型。
作者: 柀堓椛開    时间: 2014-8-7 19:00
加泛型就行了  就不用强转了
作者: Joemi    时间: 2014-8-7 20:16
泛型的问题~
作者: 继续悲伤    时间: 2014-8-7 20:41
这是一个向下转型的操作,Object包括String,所以是向下转型,反之是向上转型。
作者: /aiq玩完?/aiq    时间: 2014-8-7 21:02
楼主可是传智java0715基础班同学?:lol
作者: Justfeeling    时间: 2014-8-7 22:34
路过~~~~~
作者: 李文方    时间: 2014-8-8 07:44
准备42期,还没走完流程呢
作者: 舍我其谁    时间: 2014-8-8 17:28
路过,受教了
作者: 大★宝    时间: 2014-8-8 18:05
知识回顾,存储的是什么类型,就返回什么类型




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