Java 将对象数组强制转换为预期类的数组

Java 将对象数组强制转换为预期类的数组,java,collections,casting,object,Java,Collections,Casting,Object,仅供回顾,有人能否快速解释一下是什么阻止了这项工作(编译): …是什么让这种方式起作用的: public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray( new DataObject[ Data.size() ] ); } 我不清楚强制转换(或其他)的工作机制是什么。因为toArray()创建了一个对象数组,而您不能通过强制转换将Object[]转换为DataObject[]toArray(Dat

仅供回顾,有人能否快速解释一下是什么阻止了这项工作(编译):

…是什么让这种方式起作用的:

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}
我不清楚强制转换(或其他)的工作机制是什么。

因为
toArray()
创建了一个对象数组,而您不能通过强制转换将
Object[]
转换为
DataObject[]
toArray(DataObject[])
创建一个
DataObject
数组

是的,这是Collections类的一个缺点,也是泛型嵌入Java的方式。您可能希望
Collection.toArray()
可以返回一个E数组,但它没有

toArray(DataObject[])
调用的有趣之处在于:您不必使“a”数组足够大,因此可以使用
toArray(new DataObject[0])
调用它

如果稍后使用
.length
来获取数组长度,那么像
toArray(新的DateObject[0])
那样调用它实际上会更好。如果初始长度较大,并且返回了您传递的相同数组对象,那么您可能会在以后遇到
NullPointerException
s


我之前问了一个关于Java泛型的问题,并被指向了这个非常有用的常见问题解答:

为了确保在按照您的意图强制转换数组时的类型安全(
DataObject[]dataArray=(DataObject[])objectArray;
),JVM必须检查数组中的每个对象,所以它实际上不像类型转换那样是一个简单的操作。我认为这就是为什么您必须传递数组实例,然后
toArray()
操作将填充该实例。

在引入streams和Lambda的Java 8之后,您还可以执行以下操作:

用于强制转换对象的法线数组

Stream.of(dataArray).toArray(DataObject[]::new);
用于制作列表

dataList.stream().toArray(DataObject[]::new);

好啊那么有没有办法将对象[]强制转换为数据对象[]?否则,我不明白这个函数存在的目的。对不起,我现在想把这些愚蠢的问题弄清楚,这样以后它们就不会困扰我了。恐怕没有。您只需使用另一个toArray调用。不,您只需创建一个新数组并逐个投射对象。但是,在Java中,数组从来都不是一种可行的方法。您可以使用System.arraycopy将对象[]某种程度上“强制转换”为数据对象[]。
dataList.stream().toArray(DataObject[]::new);