[英]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.