Как сохранить список ArrayList в массив

306
22 ноября 2021, 15:20

Нужно сделать параметризованный класс, хранящий массив, с некоторой функциональностью ArrayList в виде функций add(T el), remove(int index), get(int index).

Я пытаюсь в методах использовать ArrayList, но у меня возникает проблема, как потом сохранить полученный список в правильно параметризованный массив того типа, элемент которого мы получаем.

Код функции приведен частично.

static class DynamicArray<T> {
    private T[] array;
    public NewDynamicArray() { 
    }        
    public void add(T el) {                
        List<T> list = new ArrayList<>();   
        list.add(el); 
        array = (T[]) list.toArray( // здесь ошибка приведения
            new DynamicArray[list.size()]
        );
    }
...
Answer 1

Если кратко - в Java такое невозможно: T[] array = new T[list.size()]. Из-за стирания типов (type erasure) не получится создать массив обобщённого типа, будет создаваться Object[].

Внутри класса не хранится никакой информации о его типе-параметре. Эта информация доступна только на этапе компиляции и стирается (становится недоступной) в runtime. Это происходит по историческим причинам, чтобы не ломать совместимость со старым кодом.

Впрочем, давай пока не будем забегать очень далеко, может быть, решение на поверхности.

Например, есть библиотеки, в которых уже реализованы коллекции примитивных типов. Так же советую сформулировать задачу. Возможно, есть другие решения.

На страничке https://stackoverflow.com/questions/6522284/convert-a-generic-list-to-an-array этот вопрос уже был рассмотрен. Представлен даже хак с рефлексией, как обойти данное ограничение, но не советую его использовать, особенно в производстве.

Answer 2

Вы почему-то передаете как аргумент свой класс. Как метод может его преобразовать в массив?

Воспользуйтесь toArray() без аргументов:

array = (T[]) list.toArray();
READ ALSO
Пройти с for по двумерному массиву

Пройти с for по двумерному массиву

Вопрос такой, дана задача на 8 ферзей и метод

90
С какой версии android доступен Snackbars?

С какой версии android доступен Snackbars?

На устройствах android 51 довольно часто вылезают ошибки, связанные со Snackbars

155
Spring отображение статических элементов

Spring отображение статических элементов

Приложение собираю при помощи @SpringBootApplication, стили получилось подключить в файле indexjsp

132