我有以下代码:
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
(此处fileList
是ArrayList<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()
):
返回的数组将是“安全的”,因为此集合不会保留对它的引用。 (换句话说,即使此集合由数组支持,此方法也必须分配新数组)。因此调用者可以自由修改返回的数组。
那么为什么我不能通过强制转换修改数组类型?
谢谢!
答案 0 :(得分:10)
那么为什么我不能通过强制转换修改数组类型?
Casting never 更改实际对象的类型。它只是检查有问题的引用是否是对适当类型的对象的引用,并允许您将该引用“用作”新类型。
现在toArray
引用的数组是Object[]
,而不是File[]
。您可以通过打印toArray.getClass()
来自行验证。因此,您无法将其投射到File[]
。
您可以调用接收数组的重载,此时它会做正确的事情:
Object[] toArray = fileList.toArray(new File[0]);
此时,toArray
将引用File[]
的实例,因此当您稍后投放时,一切都很顺利。