Java: (String []) List.toArray() дает ClassCastException
Следующий код (запуск в 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], а также когда в нем есть строки.
Любая идея, почему?
Ответы
Ответ 1
Это связано с тем, что при использовании
toArray()
он возвращает объект [], который не может быть передан в String [] (даже если содержимое содержит строки) Это связано с тем, что метод toArray получает только
List
а не
List<String>
поскольку generics являются только исходным кодом и недоступны во время выполнения и поэтому не могут определить, какой тип массива будет создан.
использование
toArray(new String[v2.size()]);
который выделяет правильный тип массива (String [] и нужного размера)
Ответ 2
Вы используете неправильный toArray()
Помните, что дженерики Java - это в основном синтаксический сахар. ArrayList фактически не знает, что все его элементы - это строки.
Чтобы устранить проблему, вызовите toArray(T[])
. В вашем случае
String[] v3 = v2.toArray(new String[v2.size()]);
Обратите внимание, что обобщенная форма toArray(T[])
возвращает T[]
, поэтому результат не должен быть явно лишен.
Ответ 3
String[] str = new String[list.size()];
str = (String[]) list.toArray(str);
Используйте как это.