Список файлов в массив в Java

Мне интересно, почему возникает проблема с заменой Arraylist из File на массив.

public static void main(String[] args) {
    List<File> pl = new ArrayList<File>();
    pl.add(new File ("C:\\folder"));
    String[] k;
    k = pl.toArray(new String[pl.size()]);
    System.out.println(k);
}

В простом примере выше я получу:

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.ArrayList.toArray(Unknown Source)
    at Main.main(Main.java:25)

и второй вопрос: должен ли я передавать размер Arraylist? Поскольку обе версии отлично работают с массивом строк:

k = pl.toArray(new String[pl.size()]);
k = pl.toArray(new String[] {});

Что ты здесь делаешь? Вы пытаетесь преобразовать список файлов в список строкового содержимого?

Tim Biegeleisen 15.12.2018 15:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 668
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть список объектов File, вы не можете просто поместить их в массив String, вам нужно как-то явно их преобразовать (например, путем вызова File#getName()). Самый удобный способ сделать это, вероятно, с Stream:

k = p1.stream().map(File::getName).toArray(String[]::new);

Вам не нужно преобразовывать Path в String, если вы хотите отобразить List<Path> в массив.

Вот что можно было написать (добавлю комментарий по поводу изменений):

public static void main(String[] args) {
    List<File> pl = new ArrayList<>(); // Diamond operator
    pl.add(new File ("C:\\folder"));
    File[] k = pl.toArray(new File[pl.size()]);
    k = pl.stream().toArray(File[]::new);  // equivalent to the previous line
    System.out.println(Arrays.toString(k)); // Array.toString is not overriden. So this is needed
}

Другие вопросы по теме