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