Метод String[] возвращает ненулевое значение java

#java #eclipse #intellij-idea #porting

#java #eclipse #intellij-idea #перенос

Вопрос:

Недавно я недавно перенес свой проект eclipse на IJ, и мой рандомизатор массива возвращает следующую ошибку

 java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
    at Constants.func.ranArr(func.java:42)
  

и

 (String[]) i.toArray();in func.ranArr(String[])(filter not-null)
  

это код метода

     public static String[] ranArr(String[] arr) {
        List<String> i = Arrays.asList(arr);
        Collections.shuffle(i);
        String[] r = (String[]) i.toArray();
        return r;
    }
  

Как мне это исправить, это работало в Eclipse

Комментарии:

1. Убедитесь, что ваш intellijidea использует тот же jdk для запуска как eclipse

2. Да, это тот же JDK Java SE-1.8

3. Это не выполняется в Eclipse. Он выдает точно такую же ошибку.

Ответ №1:

Вы можете заменить (String[]) i.toArray() на i.toArray(new String[0]) .

Комментарии:

1. Да, это сработало, но почему оно должно работать и eclipse, а не IJ?

2. Уверен, что это не зависит от вашей IDE, потому что это происходит во время выполнения. К сожалению, я не использую Eclipse для воспроизведения и глубокого поиска.

Ответ №2:

Поскольку ArrayList может хранить элементы любого типа, внутренне он использует a Object[] для хранения содержимого массива.

При вызове toArray() он просто возвращает копию этого внутреннего массива, который снова является an Object[] .

Фактически, из-за стирания типа (тот факт, что экземпляр универсального типа не знает во время выполнения, к какому типу относятся его параметры типа) ArrayList , он больше ничего не может сделать.

Поскольку вы знаете, что вы храните строки, вы можете использовать toArray(new String[0]) , как предложил @Timur .

Эта функция будет просматривать тип передаваемого вами массива и создавать новый массив с этим типом.