簡體   English   中英

將對象數組轉換為我想要的類的數組

[英]Casting an array of Objects into an array of my intended class

僅供參考,有人可以快速解釋是什么阻止了它的工作(編譯時):

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 類和泛型被硬塞進 Java 的方式的一個缺點。 您會期望Collection<E>.toArray()可以返回 E 數組,但事實並非如此。

關於toArray(DataObject[])調用的有趣之處:您不必使“a”數組足夠大,因此您可以根據需要使用toArray(new DataObject[0])調用它。

如果稍后使用.length來獲取數組長度,則像toArray(new DateObject[0])這樣調用它實際上會更好。 如果初始長度很大並且返回了您傳遞的相同數組對象,那么您稍后可能會遇到NullPointerException s

我之前問過一個關於 Java 泛型的問題,有人指出這個 FAQ 很有幫助: http : //www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

為了確保在按預期方式轉換數組時的類型安全( DataObject[] dataArray = (DataObject[]) objectArray; ),JVM 必須檢查數組中的每個對象,因此它實際上不是像類型轉換這樣的簡單操作. 我認為這就是為什么你必須傳遞數組實例,然后toArray()操作填充它。

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

用於投射普通的對象數組

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

用於投射列表

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM