数组转换问题

时间:2014-01-16 19:20:11

标签: java arrays

我有以下代码:

String []d=new String[]{"y","z"};
Object []ab=d;
d=(String[]) ab;
System.out.println(d[0]);
System.out.println(ab[0]);

按预期返回 y 两次

但以下代码会引发java.lang.ClassCastException(此处fileListArrayList<File>个对象)

File[] loadedFiles=new File[fileList.size()];
Object[] toArray = fileList.toArray();
loadedFiles=(File[]) toArray;
System.out.println(toArray[0]);
System.out.println(loadedFiles[0]);

虽然以下内容不会抛出任何内容:

loadedFiles=fileList.toArray(new File[0]);

Javadoc 1.5说(关于toArray()):

  

返回的数组将是“安全的”,因为此集合不会保留对它的引用。 (换句话说,即使此集合由数组支持,此方法也必须分配新数组)。因此调用者可以自由修改返回的数组。

那么为什么我不能通过强制转换修改数组类型?

谢谢!

1 个答案:

答案 0 :(得分:10)

  

那么为什么我不能通过强制转换修改数组类型?

Casting never 更改实际对象的类型。它只是检查有问题的引用是否是对适当类型的对象的引用,并允许您将该引用“用作”新类型。

现在toArray引用的数组是Object[],而不是File[]。您可以通过打印toArray.getClass()来自行验证。因此,您无法将其投射到File[]

您可以调用接收数组的重载,此时它会做正确的事情:

Object[] toArray = fileList.toArray(new File[0]);

此时,toArray将引用File[]的实例,因此当您稍后投放时,一切都很顺利。