簡體   English   中英

將復制任何多維數組的通用函數

[英]Generic function which will copy any multidimensional array

就像標題所說我試圖以通用的方式創建一個多維數組的副本,確切地說是二維數組,所以我可以在其他地方重用這個。

我將通過它的類型最有可能是用戶定義的,例如我有一個我希望以這種方式使用的Tile類。

我目前的問題是以下代碼:

在調試器中,您可以按照調用查看數組中的元素是否正確分配但是一旦返回結果,java就會拋出此異常:

java.lang.ClassCastException:[[Ljava.lang.Object; 不能投[[Lboard.Tile;

@SuppressWarnings("unchecked")
public static <T> T[][] clone(T[][] source) {
    T[][] result = (T[][]) new Object[source.length][source[0].length];
    for (int row = 0; row < source.length; row++) {
        result[row] = Arrays.copyOf(source[row], source[0].length);
    }
    return result;
}

有人知道這樣做的好方法嗎? 優化不是問題。

謝謝

這是我基於Array.copyOf()的方法

static <T> T[][] clone(T[][] source) {
    Class<? extends T[][]> type = (Class<? extends T[][]>) source.getClass();
    T[][] copy = (T[][]) Array.newInstance(type.getComponentType(), source.length);

    Class<? extends T[]> itemType = (Class<? extends T[]>) source[0].getClass();
    for (int i = 0; i < source.length; i++) {
        copy[i] = (T[]) Array.newInstance(itemType.getComponentType(), source[i].length);
        System.arraycopy(source[i], 0, copy[i], 0, source[i].length);
    }
    return copy;
}

訣竅是通過顯式指定此類型來獲取項的類型並創建數組。

編輯:不要忘記檢查源是否為空:)

發生異常,因為畢竟數組仍然是Object[][]類型,而不是類型T[][] 你可以通過使用反射來解決這個問題,就像這樣(但它很討厭):

T[][] result = (T[][]) java.lang.reflect.Array.newInstance(source[0][0].getClass(), new int[]{source.length, source[0].length});

暫無
暫無

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

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