黑马程序员技术交流社区

标题: 看视频遇到的ArrayList类的一个问题【补充。。。】 [打印本页]

作者: 丁朋    时间: 2012-8-19 18:26
标题: 看视频遇到的ArrayList类的一个问题【补充。。。】
本帖最后由 丁朋 于 2012-8-19 19:00 编辑

请问下列代码怎么编译不通过?
毕老师的视频中是可以编译通过的,为什么我在本地操作却无法编译通过!

import java.util.*;
class GenericDemo
{
public static void main(String[] args)
{
  System.out.println("Hello World!");
  ArrayList al=new ArrayList();
  al.add("abv");
  al.add("abc");
  al.add("cbc");
  printColl(al);
}
public static void printColl(ArrayList al)
{
  for(Iterator it=al.iterator();it.hasNext();)
  {
   System.out.println(it.next());  
  }
}
}


提示:
GenericDemo.java:10: 错误: 找不到符号
                al.add("abv");
                  ^
  符号:   方法 add(String)
  位置: 类型为ArrayList的变量 al
GenericDemo.java:11: 错误: 找不到符号
                al.add("abc");
                  ^
  符号:   方法 add(String)
  位置: 类型为ArrayList的变量 al
GenericDemo.java:12: 错误: 找不到符号
                al.add("cbc");
                  ^
  符号:   方法 add(String)
  位置: 类型为ArrayList的变量 al
GenericDemo.java:18: 错误: 找不到符号
                for(Iterator it=al.iterator();it.hasN
                                  ^
  符号:   方法 iterator()
  位置: 类型为ArrayList的变量 al
4 个错误


我明明import java.util.*;



补充:
我发现了
import java.util.*;
//import java.util.ArrayList;
//import java.util.Iterator;
为什么我的机器不支持通配符。

import java.util.ArrayList;
import java.util.Iterator;
这个导入就能使用,用通配符就不可以为什么?





作者: 赵方明    时间: 2012-8-19 18:29
本帖最后由 赵方明 于 2012-8-19 18:37 编辑

这个编译时可以通过的,那个提示“GenericDemo.java使用了未经检查或不安全操作”对运行没有影响
加个泛型就解决了这个问题,下面是加了泛型的代码,加了之后就没有这个问题了。
为什么会这样呢?
你建立的是ArrayList对象al,但是集合可以存储不同类型的对象,比如用al.add(4);,然后如果你调用了length()方法,
这在编译时没有问题,但是运行时,因为4不是一个字符串,就会出错。
泛型是一种安全机制,就是用来解决这个问题,它可以把问题从运行时转移到编译时。
import java.util.*;
class GenericDemo
{
public static void main(String[] args)
{
  System.out.println("Hello World!");
  ArrayList<String> al=new ArrayList<String>();//加了泛型之后,就只能存入String类型的对象,如果存入其它类型的对象,在编译时就会报错。那么安全隐患就得到了解决,
不会再出现“GenericDemo.java使用了未经检查或不安全操作”的提示
  al.add("abv");
  al.add("abc");
  al.add("cbc");
  printColl(al);
}
public static void printColl(ArrayList<String> al)
{
  for(Iterator<String> it=al.iterator();it.hasNext();)
  {
   System.out.println(it.next());  
  }
}
}

作者: 杨鹏鹏    时间: 2012-8-19 18:30
package com.itheima.test;

import java.util.ArrayList;
import java.util.Iterator;


public class GenericDemo
{
public static void main(String[] args)
{
  System.out.println("Hello World!");
  ArrayList al=new ArrayList();
  al.add("abv");
  al.add("abc");
  al.add("cbc");
  printColl(al);
}
public static void printColl(ArrayList al)
{
  for(Iterator it=al.iterator();it.hasNext();)
  {
   System.out.println(it.next());  
  }
}
}
我这个可以,你看看怎么回事
作者: 牛杨    时间: 2012-8-19 18:33
怎么会呢? 我复制你的代码都能编译通过。并且还能运行成功!

你是不是把这些当成错误了:
注: GenericDemo.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

出现这些信息是因为你没有使用泛型,并不是错误信息。
希望对楼主有帮助哦
作者: 王舜民    时间: 2012-8-19 18:34
//这是可以运行的
//因为你使用了容器,却没有用泛型,就会出现上述情况,没关系,不是什么错误
//
//接下来视频会详细将泛型的。


import java.util.*;
class GenericDemo
{
public static void main(String[] args)
{
  System.out.println("Hello World!");
  ArrayList <String> al=new ArrayList<String>();
  al.add("abv");
  al.add("abc");
  al.add("cbc");
  printColl(al);
}
public static void printColl(ArrayList al)
{
  for(Iterator it=al.iterator();it.hasNext();)
  {
   System.out.println(it.next());  
  }
}
}

   ...................瞬间爆满。。。


作者: 丁朋    时间: 2012-8-19 18:35
牛杨 发表于 2012-8-19 18:33
怎么会呢? 我复制你的代码都能编译通过。并且还能运行成功!

你是不是把这些当成错误了:

这是不是我的java编译器环境出现了问题?
作者: 牛杨    时间: 2012-8-19 18:43
丁朋 发表于 2012-8-19 18:35
这是不是我的java编译器环境出现了问题?

可能性不大。如果是你编译器环境出现了问题的话, 你直接来一个 javac 或java 命令 看看能否运行成功。
作者: 丁朋    时间: 2012-8-19 18:49
javac和javac能用。为什么我编译就是失败勒?

作者: 牛杨    时间: 2012-8-19 18:50
丁朋 发表于 2012-8-19 18:49
javac和javac能用。为什么我编译就是失败勒?

你的失败信息是啥, 弄过来 我看看
作者: 丁朋    时间: 2012-8-19 18:58
牛杨 发表于 2012-8-19 18:50
你的失败信息是啥, 弄过来 我看看

我发现了
import java.util.*;
//import java.util.ArrayList;
//import java.util.Iterator;

为什么我的机器不支持通配符。

import java.util.ArrayList;
import java.util.Iterator;
这个导入就能使用,用通配符就不可以为什么?
作者: 牛杨    时间: 2012-8-19 19:03
丁朋 发表于 2012-8-19 18:58
我发现了
import java.util.*;
//import java.util.ArrayList;

还有这事儿 ?:o  头一次碰到
这个真的不知道为什么。
你问问版主吧,这个真的不清楚,为什么你的机器不支持通配符呢?





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