Преобразование List<T> в массив T[] с гарантией типа

Создайте массив нужного runtime-типа через Array.newInstance(clazz, size), затем передайте его List.toArray. Нельзя просто привести Object[] к T[] с ожидаемым типом String[].

Короткий ответ

Что ответить на собеседовании

Создайте массив нужного runtime-типа через Array.newInstance(clazz, size), затем передайте его List.toArray. Нельзя просто привести Object[] к T[] с ожидаемым типом String[].

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте метод convert, который:

  1. Принимает объект Class<T> – класс элементов будущего массива.
  2. Принимает List<T> – набор значений, которые нужно разместить в массиве.
  3. Возвращает массив T[], содержащий те же элементы, что и список.
  4. Обеспечивает соответствие типа элементов массива переданному классу.
  5. Порядок элементов в результирующем массиве может быть произвольным.
import java.util.List;
import java.lang.reflect.Array;

public class GenericArray {
    public static void main(String[] args) {
        String[] strings = GenericArray.convert(
                String.class,
                List.of("Val1", "Val2", "Val3")
        );
        System.out.println(java.util.Arrays.toString(strings));
    }

    public static <T> T[] convert(Class<T> clazz, List<T> values) {        
        return null;
    }
}

Ответ

Создайте массив нужного runtime-типа через Array.newInstance(clazz, size), затем передайте его List.toArray. Нельзя просто привести Object[] к T[] с ожидаемым типом String[].

@SuppressWarnings("unchecked")
public static <T> T[] convert(Class<T> clazz, List<T> values) {
    java.util.Objects.requireNonNull(clazz);
    java.util.Objects.requireNonNull(values);
    if (clazz.isPrimitive()) throw new IllegalArgumentException("Reference type required");
    T[] array = (T[]) Array.newInstance(clazz, values.size());
    return values.toArray(array);
}

Порядок списка сохраняется, хотя условие этого не требует. Проверка primitive нужна и для int.class, чей generic-тип не означает, что int[] является Integer[]. Если вызывающий код обошёл generics raw-типами и передал несовместимый элемент, сохранение в массив вызовет ArrayStoreException.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее