Как создать глубокую копию универсального массива примитивных типов данных? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь создать глубокую копию двумерного массива типов int, double, boolean.

Этот вопрос Написать общий метод для копирования массива мне очень помог (см. Ниже). Но проблема в том, что на самом деле в моем коде было бы намного лучше иметь возможность просто копировать массив примитивных типов.

private <T> T[][] arrayCopy(T[][] original) {
    Class<?> arrayType = original.getClass().getComponentType().getComponentType();

    int[] dims = {original.length, original[0].length};
    T[][] copy = (T[][]) java.lang.reflect.Array.newInstance(arrayType, dims);

    for(int i = 0; i<dims[0]; i++){
        for(int j = 0; j<dims[1], j++){
            copy[i][j] = original[i][j];
        }
    }
    return copy; 
}

У меня очень ограниченные знания о дженериках Java, и я не уверен, возможно ли то, что я хочу. Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 01 июля 2019

Generics не работает для примитивных типов. Массивы примитивов являются ссылочными типами, и вы можете использовать обобщенные типы для сопоставления типов ввода и вывода, но вы не можете применить границу, чтобы проверить, что это тип массива, потому что единственным супертипом типов примитивных массивов является Object. Чтобы один и тот же код работал на всех типах массивов, вы должны будете использовать специальные методы в java.lang.reflect.Array для получения и установки элементов массива, получения длины и т. Д.

import java.lang.reflect.Array;

private <T> T[] arrayCopy2d(T[] original) {
    Class<?> arrayType = original.getClass().getComponentType().getComponentType();

    int[] dims = {original.length, Array.getLength(original[0])};
    T[] copy = (T[]) Array.newInstance(arrayType, dims);

    for(int i = 0; i<dims[0]; i++){
        for(int j = 0; j<dims[1], j++){
            Array.set(copy[i], j, Array.get(original[i], j));
        }
    }
    return copy; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...