2014-01-24 2 views
1

я не понимаю, почему это дает мне исключение в класс ролях:ArrayList метод ToArray класс литая исключение

List<String> names = new ArrayList<String>(); 
for (ApplicationInfo app : apps) { 
    names.add("" + app.loadLabel(packageManager)); 
} 
return (String[]) names.toArray(); 

Бревно:

01-23 16:56:18.746: E/AndroidRuntime(4027): Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

, но я четко определен names к a) String, а не Object

** EDIT:

oh wait, ладно, я вижу в API, он возвращает массив объектов. как я мог сделать это, не делая:

List<String> names = new ArrayList<String>(); 
for (ApplicationInfo app : apps) { 
    names.add("" + app.loadLabel(packageManager)); 
} 
String[] list = new String[names.size()]; 
return names.toArray(list); 

и создание нового массива каждый раз?

+0

вы можете цикл в списке массива и нажимной строки в массиве и возвращать его –

ответ

3

Исключение класса литая произошло только потому, что ToArray() возвращаетObject []. Разумеется, Объект [] не может быть отлит до Строка [].

Insteadly, вы можете использовать это:

String[] list = toArray(new String[names.size()]); 

который возвращает правильный бросок (String []).

1

Вам просто нужно либо прямо, либо косвенно. Кто-то должен был создать массив (с правильным размером), чтобы сохранить результат.

new String[0] предназначен для манекена, но вы создадите два объекта.

Если вы считаете, что дополнительный объект массива имеет значение, вы должны ВОЗВРАТИТЬ объект String [] или просто использовать Список без преобразования в массив.

+0

Over 10k респ и проводке ответ, а не знак как DUP? Если бы этот ответ был лучше или более полным, чем дубликат, то это будет летать, но это ... –

0

Вы могли бы сделать это вместо:

String[] list = new String[0]; 
return names.toArray(list); 

Вам не нужно выделить дополнительное пространство для размера вашего массива.

+0

Прежде всего, этот ответ не дает объяснений. Во-вторых, этот вопрос, очевидно, является дубликатом. В-третьих, зачем выделять два массива? –

+0

@BoristheSpider ей нужно больше очков при переполнении стека: '( –

2

Основываясь на javadoc, вы можете сделать это:

String[] list = names.toArray(new String[0]); 
1

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

Очень простое рабочее решение.

ApplicationInfo a1 = new ApplicationInfo("label1"); 
    ApplicationInfo a2 = new ApplicationInfo("label2"); 
    ApplicationInfo a3 = new ApplicationInfo("label3"); 

    List<ApplicationInfo> infos = new ArrayList<ApplicationInfo>(); 
    infos.add(a1); 
    infos.add(a2); 
    infos.add(a3); 

    ArrayList<String> labels = new ArrayList<String>(); 
    for (ApplicationInfo info : infos) { 
     labels.add(info.getLabel().toString()); 
    } 

    String[] lbls = labels.toArray(new String[labels.size()]); 
    for (int i = 0; i < lbls.length; i++) { 
     System.out.println(lbls[i]); 
    } 
Смежные вопросы