仅供审核,有人可以快速解释阻止其工作的原因(编译时):
private HashSet data;
...
public DataObject[] getDataObjects( )
{
return (DataObject[]) data.toArray();
}
......是什么让它成为了工作的方式:
public DataObject[] getDataObjects( )
{
return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}
我不清楚使用强制转换的机制(或其他任何东西)。
答案 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);