Инициализировать массив ArrayList

Как я могу инициализировать Array из ArrayList<String>?

Я пробовал этот синтаксис, но он не работал:

ArrayList<String>[] subsection = new ArrayList<String>[4];

Ответ 1

Этот синтаксис отлично работает для не-generic ArrayList. (ideone)

Но это не будет работать для общего ArrayList<E>: (ideone)

Этот код:

ArrayList<String>[] subsection = new ArrayList<String>[4];

Дает ошибку компилятора:

Main.java:8: generic array creation
        ArrayList<String>[] subsection = new ArrayList<String>[4];

В универсальной версии используйте ArrayList<ArrayList<E>>:

ArrayList<ArrayList<String>> subsection = new ArrayList<ArrayList<String>>();

Ответ 2

вы можете определить так:

ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
    lists[0] = new ArrayList<String>();
    lists[0].add("Hello");
    lists[0].add("World");
    String str1 = lists[0].get(0);
    String str2 = lists[0].get(1);
    System.out.println(str1 + " " + str2);

Ответ 3

Хорошо, после комментариев, я хорошо подумал... ваше право, почему бы и нет.

Выяснил это.

ArrayList[] test = new ArrayList[4];

test[3] = new ArrayList<String>();
test[3].add("HI");

System.out.println(test[3].get(0));

Хотя я буду честен, я не совсем уверен, ПОЧЕМУ это работает.

Как только вы назначаете первый элемент теста как новую коллекцию, он будет разрешать только все остальные элементы в массиве этого типа. Таким образом, вы не могли сделать

test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();

Ответ 4

Посмотрите на generics как процесс уточнения типа, вы можете назначить типизированное значение переменной raw type AND наоборот. В основных дженериках есть ярлык для программистов, чтобы избежать слишком многого типа, что также помогает ловить некоторые логические ошибки во время компиляции. При самых основах ArrayList всегда будет неявно иметь элементы типа Object.

So

test[i] = new ArrayList<String>(); because test[i] has type of ArrayList.

Бит

test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();

не работал - как и ожидалось, потому что HashSet просто не является подклассом ArrayList. Дженерики здесь нечего делать. Удалите дженерики, и вы увидите очевидную причину.

Однако

test[2] = new ArrayList<String>();
test[3] = new ArrayList<HashSet>(); 

будет работать хорошо, потому что оба элемента - ArrayLists.

Надеюсь, это имело смысл...