簡體   English   中英

Java泛型,將T []轉換為原始類型

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

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