Для получения более подробной информации обратитесь к javadocs для двух перегрузок List.toArray.
Последняя версия использует массив нулевой длины для определения типа результирующего массива. (Удивительно, но сделать это быстрее, чем предварительно выделить ... по крайней мере, для последних версий Java. Подробнее см. https://javalang.ru/a/4042464/139985.)
С технической точки зрения причина такого поведения / дизайна API заключается в том, что реализация List<T>.toArray() метода не имеет информации о том, что такое <T> во время выполнения. Все, что известно, это то, что тип необработанного элемента равен Object. Напротив, в другом случае параметр array указывает базовый тип массива. (Если предоставленный массив достаточно велик, чтобы вместить элементы списка, он используется. В противном случае выделяется новый массив того же типа и большего размера, который возвращается в качестве результата.)
1 - В Java Object[] присваивание несовместимо с a String[]. Если бы это было так, то вы могли бы сделать это: