Подтвердить что ты не робот

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], а также когда в нем есть строки. Любая идея, почему?

4b9b3361

Ответ 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);

Используйте как это.