黑马程序员技术交流社区

标题: List改为ArrayList后,无法编译,求教。 [打印本页]

作者: 黑马李刚    时间: 2011-9-1 21:24
标题: List改为ArrayList后,无法编译,求教。
[code=java]import java.util.*;
class L
{
        public static void main(String args[])
        {
                String[] c={"ligang","lignaglsdjf","lignagloei8989eiorweuiui"};
                List<String> m=Arrays.asList(c);
                System.out.println(m);
               
        }       
}[/code]
作者: 李叶    时间: 2011-9-1 21:51
在API的说明中,Arrays.asList()方法的返回值是List类型的
所以,当你调用Arrays.asList(c);时,获取的实际上是一个List类型的对象
而ArrayList是List的实现类(你可以理解为子类)

JAVA中规定,如果你将一个子类的对象赋值给一个父类的引用时,你可以直接赋值
而如果你将一个父类的对象赋值给一个子类的引用时,你就必须进行强制类型转换,否则编译就会出错
(关于引用和对象的关系,可以参考这篇帖子:http://bbs.itheima.com/thread-1332-1-1.html

所以,如果想让你这段代码编译通过的话,需要把第7行这么改:
ArrayList <String> m= (ArrayList) Arrays.asList(c);

当然,这样虽然编译可以通过,但是在运行的时候还是会出错的
因为Arrays.asList();返回的List对象实际上并不是一个ArrayList对象
所以你在将这个List对象强制转换成ArrayList对象的时候就会出错

所以,最稳妥的写法应该是像下面这样:
  1. class L {
  2.   public static void main(String args[]) {
  3.     String[] c = { "ligang", "lignaglsdjf", "lignagloei8989eiorweuiui" };
  4.     //在进行任何强制转换前,首先判断你要转换的对象是不是你要转换的类型
  5.     if (Arrays.asList(c) instanceof ArrayList) {
  6.       ArrayList <String> am = (ArrayList)Arrays.asList(c);
  7.       System.out.println(am);
  8.     } else {
  9.       List <String> m = Arrays.asList(c);
  10.       System.out.println(m);
  11.     }
  12.   }
  13. }
复制代码
[ 本帖最后由 李叶 于 2011-09-01  21:57 编辑 ]
作者: 匿名    时间: 2011-9-1 22:21
灌水,学习一下
作者: 匿名    时间: 2011-9-1 22:28
李叶不仅功夫扎实,而且还很有耐性!值得学习~~~
作者: 匿名    时间: 2011-9-1 22:35
我明白了,谢谢李叶的回答,俺学习之榜样。




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