Java: (String []) List.toArray () дает исключение ClassCastException - PullRequest
90 голосов
/ 17 апреля 2011

Следующий код (запущенный в Android) всегда дает мне ClassCastException в 3-й строке:

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

Ответы [ 3 ]

229 голосов
/ 17 апреля 2011

Это потому, что когда вы используете

 toArray() 

, он возвращает Object [], который не может быть приведен к String [] (даже если содержимое является Strings) Это потому, что метод toArrayполучает только

List 

, а не

List<String>

, так как генерики являются только исходным кодом и недоступны во время выполнения, поэтому он не может определить, какой тип массива создавать.

использовать

toArray(new String[v2.size()]);

, который выделяет правильный тип массива (String [] и правильного размера)

35 голосов
/ 17 апреля 2011

Вы используете неправильный toArray()

Помните, что дженерики Java в основном являются синтаксическим сахаром. ArrayList на самом деле не знает, что все его элементы являются строками.

Чтобы решить вашу проблему, звоните toArray(T[]). В вашем случае

String[] v3 = v2.toArray(new String[v2.size()]);

Обратите внимание, что обобщенная форма toArray(T[]) возвращает T[], поэтому результат не нужно явно приводить.

0 голосов
/ 09 февраля 2019

String [] str = new String [list.size ()];

str = (String []) list.toArray (str);

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

...