将对象数组转换为我想要的类的数组

2022-09-01 09:49:55

只是为了回顾一下,有人可以快速解释是什么阻止了它的工作(在编译时):

private HashSet data;

...

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

...以及是什么使它成为工作方式:

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

我不清楚铸造(或其他任何东西)的机制使这一点如此。


答案 1

因为创建了一个 Object 数组,而你不能仅仅通过投射它来制作它。 创建一个数组。toArray()Object[]DataObject[]toArray(DataObject[])DataObject

是的,这是 Collections 类的一个缺点,也是 Generics 被硬塞进 Java 的方式。你会期望它可以返回一个E数组,但它不会。Collection<E>.toArray()

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

如果稍后使用以获取数组长度,则像这样调用它实际上会更好。如果初始长度很大,并且您传递的相同数组对象被返回,那么您可能会在以后面对toArray(new DateObject[0]).lengthNullPointerException

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


答案 2

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