Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阵列投射问题_Java_Arrays - Fatal编程技术网

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]);