将一个Object数组转换为我想要的类的数组

时间:2008-12-27 14:09:31

标签: java collections casting object

仅供审核,有人可以快速解释阻止其工作的原因(编译时):

private HashSet data;

...

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray();
}

......是什么让它成为了工作的方式:

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}

我不清楚使用强制转换的机制(或其他任何东西)。

3 个答案:

答案 0 :(得分:38)

因为toArray()会创建一个Object数组,而您只能通过强制转换Object[]进入DataObject[]toArray(DataObject[])创建了一个DataObject的数组。

是的,这是Collections类的缺点以及Generics被用于Java的方式。你期望Collection<E>.toArray()可以返回一个E数组,但事实并非如此。

关于toArray(DataObject[])电话的有趣之处:您不必将“a”数组放得足够大,因此如果您愿意,可以使用toArray(new DataObject[0])调用它。

如果稍后使用toArray(new DateObject[0])来获取数组长度,那么将其称为.length实际上会更好。如果初始长度很大并且返回了您传递的相同数组对象,那么您可能会在NullPointerException之后面对

之前我问了一个关于Java泛型的问题,并指出这个非常有用的常见问题解答:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

用于投射普通的对象数组

Stream.of(dataArray).toArray(DataObject[]::new);

用于投射列表

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