将一个Object数组转换为我想要的类的数组
仅供审阅,有人可以快速解释阻止其工作的原因(编译时):
private HashSet data; ... public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray(); }
……这是什么使得它的工作方式:
public DataObject[] getDataObjects( ) { return (DataObject[]) data.toArray( new DataObject[ Data.size() ] ); }
我不清楚使用铸造(或其他任何东西)的机制是如此。
因为toArray()
创建了一个Object数组,并且只能通过强制转换将Object[]
转换为DataObject[]
。 toArray(DataObject[])
创建一个DataObject
数组。
是的,它是Collections类的缺点,也是Generics被用于Java的方式。 你期望Collection
可以返回一个E数组,但事实并非如此。
关于toArray(DataObject[])
调用的有趣之处:你不必使“a”数组足够大,所以你可以使用toArray(new DataObject[0])
调用它,如果你愿意的话。
如果你稍后使用.length
来获取数组长度,那么调用它就像toArray(new DateObject[0])
实际上更好。 如果初始长度很大并且返回了您传递的相同数组对象,那么稍后您可能会遇到NullPointerException
我之前问了一个关于Javagenerics的问题,并指出这个非常有用的FAQ: http : //www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
为了确保在按照您的意图投射数组时的类型安全性( DataObject[] dataArray = (DataObject[]) objectArray;
),JVM必须检查数组中的每个对象,因此它实际上不是像类型转换那样的简单操作。 我认为这就是为什么你必须传递数组实例,然后toArray()
操作填充。