ArrayList list=new ArrayList (;
String strings[]=(String [] ) list.toArray (;
我个人认为这样写代码没有任何问题,编译也没有问题。 但是,在具体运行时报告异常的情况如下。 exceptioninthread ' main ' Java.lang.classcastexception : [ ljava.lang.object;
但是,这样写没有问题:
ArrayList list=new ArrayList (;
string strings [ ]=new string [ list.size ();
for(intI=0,j=list.size ); I
strings[I]=list.get(I;
}
对于这一现象,Java允许向上和向下转换,但此转换是否成功取决于Java虚拟机中此对象的类型。 Java虚拟机存储每个对象的类型。 数组也是对象。 数组类型为[Ljava.lang.Object。 [显然,将[Ljava.lang.Object转换为[Ljava.lang.String是不可能的。 这是向下广播,虚拟机仅存储这是Object数组,并不保证数组中的元素是字符串,因此此转换不会成功。 数组中的元素是元素的引用,而不是存储的特定元素,因此数组中的元素类型仍然存储在Java虚拟机中。
根据以上说明,可以将该问题归纳为以下模型。
Object objs[]=new Object[10];
String strs[]=(String[] ) objs;
这和刚才的编译错误一样。 修改此代码将如下所示:
String strs[]=new String[10];
Object objs[]=strs;
这样就可以编译了。 这个问题可以归结为Java变革规则的问题。 介绍对Java数组模板类型的支持。
虽然JDK5已经有模板类型支持,并保证了数据类型在集合和Map中的安全性,但是List的toArray方法返回Object []令人困惑。 我个人觉得,根据类型,应该可以直接返回相应的T []。 仔细看看JDK,List可以通过两种方法将其转换为阵列。
公共对象[ ] to array (;
此方法将List中的所有元素返回相同大小的数组。 数组中的所有元素都是Object类型。
publict[]toArray(t[]a );
此方法将List中的所有元素返回到大小相同的数组中。 数组中的所有元素都是t型。
List之所以这样设计,是因为Java编译器不允许new类型数组。 也就是说,数组不能这样定义。
T arr=new T[size];
但是,可以用T[]表示数组,可以强制将数组转换为T[]。 例如,List的公共t [ ] to array (t [ ] a就是这样实现的。
publict[]toarray(t[]a ) {
if(a.Lengthsize ) )。
a=(t ) ) java.lang.reflect.Array。
newinstance(a.getclass ().getComponentType )、size );
system.arraycopy(elementdata,0,a,0,size );
if(a.Lengthsize ) )。
a[size]=null;
返回a;
}
从上面的代码可以看出,由于不知道此数组的类型,因此需要在反射机制中创建此数组。 ((a.getClass ) ).getComponentType ) )方法获取数组元素的类型。
最终,将List转换为Array后,可以执行以下操作:
ArrayList list=new ArrayList (;
string [ ] strings=new string [ list.size (];
list.to array (字符串);
相反,如何将数组转换为List? 如下所示。
String[] s={'a '、' b '、' c'};
list list=Java.util.arrays.as list (s;