32

只是为了审查,有人可以快速解释是什么阻止了它的工作(编译时):

private HashSet data;

...

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

...以及是什么使它成为有效的方式:

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

我不清楚与铸造(或其他任何东西)一起工作的机制是什么。

4

3 回答 3

40

因为toArray()创建了一个对象数组,而你不能仅仅通过转换它来实现 Object[]。创建一个数组。DataObject[]toArray(DataObject[])DataObject

是的,这是 Collections 类和泛型被硬塞进 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

于 2008-12-27T14:19:42.077 回答
3

为确保在按预期转换数组时类型安全DataObject[] dataArray = (DataObject[]) objectArray;(我认为这就是为什么您必须传递数组实例,toArray()然后操作会填充该实例。

于 2008-12-27T14:20:29.750 回答
2

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

用于投射一个普通的对象数组

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

用于投射列表

dataList.stream().toArray(DataObject[]::new);
于 2021-04-15T19:41:22.840 回答