Следующий код (запущенный в android) всегда дает мне ClassCastException в третьей строке:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Это также происходит, когда v2 имеет значение Object [0], а также когда в нем есть строки. Любая идея, почему?
java
list
classcastexception
toarray
Гавриил
источник
источник
toArray()
метода.Ответы:
Это потому, что когда вы используете
он возвращает Object [], который не может быть преобразован в String [] (даже если содержимое является строками). Это потому, что метод toArray получает только
и нет
поскольку дженерики - это только исходный код, недоступный во время выполнения, поэтому он не может определить, какой тип массива создать.
использовать
который выделяет правильный тип массива (String [] и нужного размера)
источник
toArray
методы существовали до классов коллекций были общими.toArray(new String[0])
лучше использовать : «В более старых версиях Java использование массива с предварительно заданным размером было рекомендовано, так как вызов отражения, необходимый для создания массива надлежащего размера, был довольно медленным. Однако, поскольку поздние обновления OpenJDK 6 этот вызов был встроен, что сделало производительность версии с пустым массивом такой же, а иногда и лучше. Кроме того, передача предварительно заданного массива опасна для параллельной коллекции, поскольку между вызовомsize
и возможна гонкаtoArray
».Вы неправильно используете
toArray()
Помните, что дженерики Java - это в основном синтаксический сахар. На самом деле ArrayList не знает, что все его элементы являются строками.
Чтобы решить вашу проблему, позвоните
toArray(T[])
. В твоем случае,Обратите внимание, что обобщенная форма
toArray(T[])
возвращаетсяT[]
, поэтому нет необходимости явно приводить результат.источник
также делает свой трюк, обратите внимание, что вам даже не нужно больше выполнять приведение, как только методу задан правильный ArrayType.
источник
Используйте вот так.
источник