2014-11-24 6 views
6

я встретил проблему следующим образом:Initialize ArrayList <ArrayList <Integer>>

Когда я инициализировать ArrayList<ArrayList<Integer>>, коды являются:

ArrayList<ArrayList<Integer>> group = new ArrayList<ArrayList<Integer>>(); 
group.add((ArrayList<Integer>) Arrays.asList(1, 2, 3)); 
group.add((ArrayList<Integer>) Arrays.asList(4, 5, 6)); 
group.add((ArrayList<Integer>) Arrays.asList(7, 8, 9)); 
for (ArrayList<Integer> list : group) { 
    for (Integer i : list) { 
     System.out.print(i+" "); 
    } 
    System.out.println(); 
} 

Хотя коды могут быть успешно скомпилирован, я все еще получаю исключение на консоли:

Исключение в потоке "основной" java.lang.ClassCastException: java.util.Arrays $ ArrayList не может быть приведен к java.util.ArrayList на Solution.main (Solution.java:49)

Спасибо за помощь!

+0

Это поражает меня как нечто, что нужно поймать во время компиляции. Что с принудительным броском? – Blindy

ответ

9

Arrays.asList не возвращает java.util.ArrayList. Это делает возвращает экземпляр класса под названием ArrayList, по совпадению - но это не java.util.ArrayList.

Если вам потребность это не по-настоящему быть ArrayList<ArrayList<Integer>> я просто изменить его на:

List<List<Integer>> group = new ArrayList<>(); 
group.add(Arrays.asList(1, 2, 3)); 
group.add(Arrays.asList(4, 5, 6)); 
group.add(Arrays.asList(7, 8, 9)); 
for (List<Integer> list : group) { 
    ... 
} 

Если вы сделать нужен ArrayList<ArrayList<...>> - или, если вам нужно, чтобы иметь возможность добавлять к «внутренний» список, даже если вам не нужно их со статическим типом ArrayList - то вам нужно создать новый ArrayList для каждого списка:

group.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3))); 
// etc 
+1

@manouti: До! Я скопировал эту строку специально, чтобы сделать это ... Готово. –

4

Возврат Arrays.asList не является java.util.ArrayList; java.util.Arrays$ArrayList - отдельный класс, вложенный в Arrays, даже если это List.

Если вы должны иметь ArrayList, а затем создать еще один ArrayList самостоятельно, используя возвращенную List из Arrays.asList, вместо литья, например .:

group.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3))); 
2

Arrays.asList возвращает экземпляр вложенного статического типа java.util.Arrays.ArrayList, который отличается от java.util.ArrayList. Вы можете избежать этой проблемы путем программирования с интерфейсом List (который java.util.Arrays.ArrayList реализует, а) и без ненужных слепков:

List<List<Integer>> group = new ArrayList<List<Integer>>(); 
group.add(Arrays.asList(1, 2, 3)); 
group.add(Arrays.asList(4, 5, 6)); 
group.add(Arrays.asList(7, 8, 9)); 
for (List<Integer> list : group) { 
    for (Integer i : list) { 
     System.out.print(i+" "); 
    } 
    System.out.println(); 
} 
0
group.add(new ArrayList<Integer>((Arrays.asList(1, 2, 3)))); 
group.add(new ArrayList<Integer>((Arrays.asList(4, 5, 6)))); 
group.add(new ArrayList<Integer>((Arrays.asList(7, 8, 9)))); 

for (ArrayList<Integer> arrayList : group) { 
    for (Integer integer : arrayList) { 
    System.out.println(integer); 
    } 
} 

Пожалуйста, обратитесь этот код. Это может помочь вам в достижении ваших требований.

+1

Как ваш ответ действительно отличается от уже принятого? – yakobom