Java 阵列投射问题
我有以下代码:Java 阵列投射问题,java,arrays,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(这里fileList是一个ArrayList对象) 而以下内容不会抛出任何内容: loadedFiles=fileList.to
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
对象)
而以下内容不会抛出任何内容:
loadedFiles=fileList.toArray(new File[0]);
说(关于toArray()):
返回的数组将是“安全的”,因为此集合不维护对它的引用。(换句话说,即使此集合由数组支持,此方法也必须分配新数组)。因此,调用者可以自由修改返回的数组
那么为什么我不能通过强制转换来修改数组类型呢
谢谢
那么为什么我不能通过强制转换来修改数组类型呢
强制转换不会更改实际对象的类型。它只是检查所讨论的引用是否是对适当类型的对象的引用,并允许您将该引用“用作”新类型
现在toArray
的值所指的数组是对象[]
,而不是文件[]
。您可以通过打印toArray.getClass()
来验证这一点。因此,您不能将其强制转换为文件[]
您可以调用一个重载,该重载接受一个数组,此时它将执行正确的操作:
Object[] toArray = fileList.toArray(new File[0]);
在这一点上,
toArray
将引用文件[]
的一个实例,因此当您稍后对其进行强制转换时,一切都很好。Jon,这一原理被称为逆变
?@OrelEraki:不,不是真的。引用类型数组对象本身是协变的-因此可以将引用的字符串[]
分配给对象[]
变量。你是这么想的吗?
Object[] toArray = fileList.toArray(new File[0]);