List<Record> list = new ArrayList<Record>();
Record[] arr = new Record[list.size()];
arr = (Record[]) list.toArray();其中Record是自己定义的类。程序运行中在第三行报异常。说是ClassCastException
为什么是错的呢?list.toArray()返回Object[],然后转换Record[],为什么转不过去呢?

解决方案 »

  1.   

    报这个异常是:一个强制类型转换错误异常
    toArray() 返回的是 object而不是数组
    可以用方法解决
    Record[] arr = new Record[list.size()];
    (Iterator iter = list.iterator();iter.hasNext();){ 
    arr [i] = ((Record)iter.next()).intValue(); 
    }
      

  2.   

    假设list里面装的是苹果,你自己定义了一个桃子,请问苹果能强制转成桃子吗
      

  3.   


    。运算符的优先(Record[])(list.toArray())
      

  4.   

    list里面放的是Record的集合。调用toArray()方法,返回object[],转换为Record[]有何不可呢?
      

  5.   


    额,sorry,错了,汗楼主试试另外一个方法
    public  <T>T[]  toArray(T[] array)
      

  6.   


    List<Record> list = new ArrayList<Record>();
    Record[] arr = new Record[list.size()];
    arr = (Record[]) list.toArray(arr);这样可以,使用List的T[] toArray(T[] a)方法。
      

  7.   

    关键问题是list.toArray();是一个这样的数组,Object{Object,Object,Object};里面存放的是Object 而不是String所以就不能直接转换了。如果是Object{String,String,String};这样就可以直接转换了。所以必须像一楼说的那样去转换。
      

  8.   

    Object{String,String,String};应该改成{Record,Record,Record};
    8楼那样也可以呢,只是已经是泛型了,不必在转换了,直接  arr = list.toArray(arr);就可以了。
      

  9.   


    lz, toArray()方法返回的是Object[]类型的,Object[]是Record[]类型的父类,这属于向下转型,A是B的子类,A a =  (A)b;  这样转型成功的前提是b必须是A的一个实例。所以可以用 public <T>T[] toArray(T[] array)方法 
      

  10.   

    说白了就是向下转型错误,
    A a = (A)b
    向下转型必须满足b是A的对象或者B继承A
      

  11.   

    水果筐可以装任何水果,苹果筐只能装苹果就算你知道一个水果筐里面装的都是苹果,你也不能说那个水果筐就是苹果筐啊,对吧?返回的是OBJECT数组,就算你知道里面都是RECORD,你也不能把它给扭成RECORD数组,谢谢....方法楼上的都给出了,要么遍历转里面的对象,不过推荐还是用toArray(new Record[0])..
      

  12.   

    你得这么去看,数组也是有类型的,即Object[]跟Record[]是不同的类型,就像Object跟Record是不同的类型一样。
    所以new Object[]{new Record(), new Record()}和new Record[]{new Record(), new Record()}这两个数组的类型是不同的,一个是Object数组,另一个是Record数组,虽然它们的内容是一样的。幸运的是,数组类型也跟它的元素类型一样有继承关系的,所以Object[] objects = new Record[]{...}是正确的。为了加深理解,我们看下面几行代码。
    Object[] objects = new Record[]{new Record(), new Record()};
    Record[] records = (Record[])objects; //这行不会出错,因为这个赋给objects的本来就是Record[]类型。
    objects = new Object[]{new Record(), new Record()}; //注意这里不再是Record[]类型了,而是Object[]类型。
    records = (Record[])objects; //这行会出错,因为数组类型(不要只看内容元素的类型)原因,根本无法转过来。再说回来,楼主提到的例子里面,toArray()和toArray(T[]),通常大家第一眼看过去都会感觉它们长得很像,而且前一个看上去更方便一些,因为它不需要多声明一个局部变量。所以大家习惯上喜欢第一个方法多一些。
    遗憾的是,在这种情况下,你要得到Record[]类型的话,第一个方法是没办法直接用的,得绕个弯子,还容易出错,反而第二个方法。
    至于原因,纯粹是实现问题,toArray()返回的是Object[]而不是T[],当然它这样实现也是有原因的,因为如果要在toArray()里面构造并返回实实在在的T[]的话,它必须找回当前范型参数的类型到底是哪个class,而这不是一样容易的事,因为java是所谓的“假范型”(还得另外用一大篇才能说明白这个问题),至于toArray(T[]),因为这个数组根本就不是在里面构造的,所以实现起来很简单。^_^
      

  13.   

    哦,对了,你真要用toArray()来避免多写一行专门用来声明数组的代码的话,可以像下面这样写:
    List<Record> list = new ArrayList<Record>();
    Record[] arr = Arrays.copyOf(list.toArray(), list.size(), Record[].class);遗憾的是,Arrays.copyOf()只有JRE 6以上版本才有。
      

  14.   

    而且这个过程实际上生成了两个数组(一个object[]数组,另一个record[]数组),所以如果数组大的话,性能就会差一些。
      

  15.   

    方法没用对而已
    List<Record> list = new ArrayList<Record>();
    Record[] arr = list.toArray(new Record[0]);
      

  16.   

    List<Record> list = new ArrayList<Record>();
    Record[] arr = list.toArray(new Record[list.size()]);
      

  17.   

    arr = (Record[]) list.toArray(new Record[list.size()]);
      

  18.   

    list.toArray(new String[list.size()])
      

  19.   

    List<User> list = new ArrayList<User>();
    User user = new User();
    user.name="33";
    list.add(user);
    User[] arr = new User[list.size()];
    arr =  list.toArray(arr); 
    System.out.println(arr[0].name);用toArray(User[] user)这个方法
      

  20.   

    object[]与Record[]是两种不同的数据类型,它们之间没有什么关系,不能这样转