String[] s =(String[]) list.toArray();出现java.lang.ClassCastException异常问题

首先介绍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是为了节省空间,因为它只是为了说明返回的类型。

此为解决办法

                                                                                                        

猜你喜欢

转载自blog.csdn.net/Oceanside_yh/article/details/81258046