#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 .
Эта функция будет просматривать тип передаваемого вами массива и создавать новый массив с этим типом.