[英]Java generics, Casting a T[] to original type
我有一個看起來像這樣的容器類。 (我正在刪除所有邏輯方法以減少混亂)
public abstract class Container<T> {
protected T[] array;
public Container(int capacity) {
array = (T[]) new Object[capacity];
}
public T[] array() {
return array;
}
}
使用此類,如下所示:
public final class ItemContainer extends Container<Item> {
public ItemContainer(int capacity) {
super(capacity);
}
}
現在,此容器應容納一個Items數組。 但是,當嘗試將其傳遞給要使用的Item[]
,會出現以下錯誤:
線程“ ForkJoinPool-2-worker-1”中的異常java.lang.ClassCastException:[Ljava.lang.Object; 無法轉換為[Lcom.oblivion.entity.item.Item;
我該如何解決?
創建對象(或實際上任何其他對象)的數組時,在轉換時它不會更改類型,實際上,轉換為通用T []完全沒有效果。 因此, array
方法返回一個Object數組,調用方嘗試將其隱式轉換為Item數組,而該方法當然會失敗。
如果要創建參數類型的數組,則應該有一個接受Class<T>
。 然后,您可以使用Array.newInstance方法創建數組。
或者,您可以使用ArrayList所使用的方法:在內部使用Object數組,如果調用者想要數據快照,則要求調用者傳遞適當類型的數組。
public Container(Class<T> clazz, int capacity) {
array = (T[]) Array.newInstance(clazz, capacity);
}
在語言設計中,需要強制轉換有點偶然。 存在一個具有多個維的重載newInstance
,因此,在T[]...[]
的情況下,無法完成通用結果類型。
您可能要存儲用於創建對象或強制轉換的組件類:
T t = clazz.cast(object);
T t = clazz.newInstance();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.