首先介绍toArray()的两种用法:
1、 public Object[] toArray()
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组
不带参数的的toArray()方法,实际上是返回了一个Object[] 的数组
public <T> T[] toArray(T[] a)
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定的数组能容纳列表,则将该列表返回此处。否则,将分配一个具有指定数组的运行时类型和此列表大小的新数组。
带参数的toArray()方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常。
该方法用了泛型,并且是用在方法的创建中(<T> 相当于定义泛型,T[]是在使用泛型T)
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
2、 String[] s =(String[]) list.toArray();
这样写本身是不合理的,因为数组整体是不可以参加强制转换的。java中一个数组初始化都是一个一个的来的,所以不可能实现把一个数组里的全部元素一次性换成其他类型,强制转换只是针对单个对象的。
若是想把Object[] 数组转换成String[] 数组,比较麻烦。如下:
String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。对于在原数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效而在原数组无效的所有索引,副本将包含 null。当且仅当指定长度大于原数组的长度时,这些索引存在。所得数组属于 newType 类。
3. String[] x = (String[]) v.toArray(new String[0]);
new String[0]相当于开辟了一个长度为0的String[],并且指定了泛型。这样函数的调用是将list转换了一个String的数组。
这里的用new String[0]只是为了指定函数的形参数,最终返回的String[]的长度是由你的list存储内容的长度决定了。
new String[0]就是起一个模板的作用,指定了返回数组的类型,0是为了节省空间,因为它只是为了说明返回的类型。
此为解决办法