黑马程序员技术交流社区
标题:
关于Iterator中的一个问题。
[打印本页]
作者:
逝去的记忆ヽ
时间:
2012-6-18 12:33
标题:
关于Iterator中的一个问题。
本帖最后由 逝去的记忆ヽ 于 2012-6-18 20:21 编辑
直接上代码:
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("dfafd");
al.add("jdsasf");
al.add("sadfd");
al.add("jaads");
for (Iterator it = al.iterator(); it.hasNext() ; )
{
//String s = (String)it.next();//
为什么这里一定要强转一下呢?直接用String类中的方法为什么不行啊?
sop(it.next());//
我的问题是:这里接受的是添加进来的字符串。那么他应该具备字符串应有发方法啊?可是it.next().length()就会报错。
}
作者:
唐辉辉
时间:
2012-6-18 12:36
本帖最后由 唐辉辉 于 2012-6-18 12:42 编辑
你应该还没有学习到泛型。
如果在定义ArrayList和Iterator时指定了其接收的类型,后面就不用强转,也可以调用其方法了。下面是更改后的代码,请参考:
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("dfafd");
al.add("jdsasf");
al.add("sadfd");
al.add("jaads");
for(Iterator<String> it = al.iterator(); it.hasNext();){
String s = it.next();
System.out.println(s);
//System.out.println(it.next().length());
}
}
作者:
陈嘉宾
时间:
2012-6-18 12:47
本帖最后由 陈嘉宾 于 2012-6-18 12:51 编辑
直接打印字符串遍历就可以,但是要获得长度就得用String类型的方法了所以要强转成String类型可以使用String类的特有方法,而上面用的都是ArrayList的方法,所要要强转,接受字符串只做了打印动作。要用到字符串的特有方法只能强转,或者接下来的泛型。
作者:
余银桂
时间:
2012-6-18 13:06
你可以看一下API文档里,next()的返回值是什么?目前你还没接触到泛型,所以要进行一个强转过程。
作者:
薄炳鑫
时间:
2012-6-18 13:29
解释见代码
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("dfafd");
al.add("jdsasf");
al.add("sadfd");
al.add("jaads");
for (Iterator it = al.iterator(); it.hasNext() ; )
{
//String s = (String)it.next();//构造容器的时候加入泛型,这里就不用使用强转。
sop(it.next());//因为jvm就不知道你传入的是什么类型,所以不具备你说的那些方法。只有jvm知道了类型才能有这些方法。
}
复制代码
作者:
邓杰
时间:
2012-6-18 15:46
刚刚回答了另一个朋友的问题和你这个差不多给你粘过来了:
我想你是想问 为什么往ArrayList里面明明传的是String类的对象;为什么通过跌代器出来后还是Object的类型是吧;
要弄清楚这个问题在毕老师后面的泛型会有详细的讲解;
我在这儿给你大概解释一下 说的不全面希望可以帮到你;当成是后面视频的预习吧;
首先你可以查阅API可以发现ArrayList的后面是带着泛型的;
什么是泛型;通俗的讲就是在往ArrayList集合里存元素之前就确定元素的类型,不是指定的元素不能存;把运行时的错误提前到编译时期;让程序更安全。
以你的这个代码为例:因为你的ArrayList集合没有加泛型;所以往你里存的所以元素都是以Object的形式存入的 而所有的对象都是Object的子类;所以编译可以 通过 ;而在
迭代过程中也是以Object的形式往外返;而你.length方法是String类的特有方法;Object并不具备;所以会报错;提示你找不符号;在学习泛型之前的解决方案是把Object对象向下转换,这样才可以调用子类的特有方法也就String类的特有方法;
在学习了泛型之后就应该这样写了:
import java.util.*;
class ABC
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("dfafd");
al.add("jdsasf");
al.add("sadfd");
al.add("jaads");
for (Iterator<String> it = al.iterator(); it.hasNext() ; )
{
//String s = (String)it.next();//因为父类引用不具备子类特有功能;所以没有加泛型且没有向下转换时就会报错;
sop(it.next().length());//加了泛型就可以了;
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2