List<Record> list = new ArrayList<Record>();
Record[] arr = new Record[list.size()];
arr = (Record[]) list.toArray();其中Record是自己定义的类。程序运行中在第三行报异常。说是ClassCastException
为什么是错的呢?list.toArray()返回Object[],然后转换Record[],为什么转不过去呢?
Record[] arr = new Record[list.size()];
arr = (Record[]) list.toArray();其中Record是自己定义的类。程序运行中在第三行报异常。说是ClassCastException
为什么是错的呢?list.toArray()返回Object[],然后转换Record[],为什么转不过去呢?
toArray() 返回的是 object而不是数组
可以用方法解决
Record[] arr = new Record[list.size()];
(Iterator iter = list.iterator();iter.hasNext();){
arr [i] = ((Record)iter.next()).intValue();
}
。运算符的优先(Record[])(list.toArray())
额,sorry,错了,汗楼主试试另外一个方法
public <T>T[] toArray(T[] array)
List<Record> list = new ArrayList<Record>();
Record[] arr = new Record[list.size()];
arr = (Record[]) list.toArray(arr);这样可以,使用List的T[] toArray(T[] a)方法。
8楼那样也可以呢,只是已经是泛型了,不必在转换了,直接 arr = list.toArray(arr);就可以了。
lz, toArray()方法返回的是Object[]类型的,Object[]是Record[]类型的父类,这属于向下转型,A是B的子类,A a = (A)b; 这样转型成功的前提是b必须是A的一个实例。所以可以用 public <T>T[] toArray(T[] array)方法
A a = (A)b
向下转型必须满足b是A的对象或者B继承A
所以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[]),因为这个数组根本就不是在里面构造的,所以实现起来很简单。^_^
List<Record> list = new ArrayList<Record>();
Record[] arr = Arrays.copyOf(list.toArray(), list.size(), Record[].class);遗憾的是,Arrays.copyOf()只有JRE 6以上版本才有。
List<Record> list = new ArrayList<Record>();
Record[] arr = list.toArray(new Record[0]);
Record[] arr = list.toArray(new Record[list.size()]);
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)这个方法