Создайте массив нужного runtime-типа через Array.newInstance(clazz, size), затем передайте его List.toArray. Нельзя просто привести Object[] к T[] с ожидаемым типом String[].
Преобразование List<T> в массив T[] с гарантией типа
Создайте массив нужного runtime-типа через Array.newInstance(clazz, size), затем передайте его List.toArray. Нельзя просто привести Object[] к T[] с ожидаемым типом String[].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте метод convert, который:
- Принимает объект
Class<T>– класс элементов будущего массива. - Принимает
List<T>– набор значений, которые нужно разместить в массиве. - Возвращает массив
T[], содержащий те же элементы, что и список. - Обеспечивает соответствие типа элементов массива переданному классу.
- Порядок элементов в результирующем массиве может быть произвольным.
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.