A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天外的星 中级黑马   /  2014-5-9 12:43  /  1334 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 天外的星 于 2014-5-10 12:34 编辑

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo1 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String[] str = {"a","b","c"};
               
                List list = Arrays.asList(str);
                ArrayList a = (ArrayList)list;
               
                System.out.println(a);
        }
}

ArrayList不是List的子类吗,这段代码编译时确实也没报错,为什么运行时却报类型转换异常?应该怎么转才不会报错?

5 个回复

倒序浏览
本帖最后由 job 于 2014-5-9 13:48 编辑

你把List强转成ArrayList,无非是想用ArrayList的方法,而这必须通过多态实现
  1.   List list =new ArrayList(Arrays.asList(str)) ;
  2.                 //ArrayList a = (ArrayList)list;
  3.                 list.add("e")//测试一下
  4.                 System.out.println(list);
复制代码

至于,将接口强转成其实现类,这里为什么不行,我也还没搞明白。但是既然有多态,这样强转好像也没意义。
回复 使用道具 举报 1 0
我记着多态中提到的类型下降是把一个子类类型提升为父类,形成多态,之后父类以为一些需求再转换为子类,
你直接将一个父类下降为一个子类,需求是什么啊?
也酒是允许
1.子类——》父类——》子类   这是正常的类型提升和转换
没见过
2.父类——》子类
感觉想想都不科学啊
由1来说,怎么变都是子类在做动作,你把狗说成是动物是允许的,但是你把动物都说成是狗这就有违常理了!
回复 使用道具 举报
本帖最后由 jieyu90 于 2014-5-9 21:09 编辑

一定要注意:Arrays.asList()方法返回的List集合不是普通的ArrayList类的实例,而是Arrays的内部类ArrayList的实例。
ArrayList类和Arrays.ArrayList类虽然都继承AbstractList类,但他们本身就不是同一个类,所以可以使用List变量接收,但是相互间不可以转换,错误类型同下面的例子:
class Person{
}
class EarthPerson extends Person
{
}
class MoonPerson extends Person
{
}
public class PersonTest
{
        public static void main(String[] args){
                  // TODO Auto-generated method stub
                Person p = new EarthPerson();
                MoonPerson mp = (MoonPerson)p;
        }
}

另外附Arrays.ArrayList的声明:
  1. private static class ArrayList<E> extends AbstractList<E>
  2.         implements RandomAccess, java.io.Serializable
  3. {
  4. }
复制代码
可以看到,它是一个只能在Arrays类内部使用的类(private类型),而且该类是一个长度固定的List集合,这点和ArrayList也不一样。

点评

写的很详细、很明白,谢谢  发表于 2014-5-12 08:12
回复 使用道具 举报 1 0
  1.     public static <T> List<T> asList(T... a) {
  2.         return new ArrayList<>(a);
  3.     }
复制代码


顺便把Arrays.asList()的代码也贴出来,可以看到,asList()真正的返回值类型其实是Arrays.ArrayList的实例。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马