Как я могу инициализировать Array
из ArrayList<String>
?
Я пробовал этот синтаксис, но он не работал:
ArrayList<String>[] subsection = new ArrayList<String>[4];
Как я могу инициализировать Array
из ArrayList<String>
?
Я пробовал этот синтаксис, но он не работал:
ArrayList<String>[] subsection = new ArrayList<String>[4];
Этот синтаксис отлично работает для не-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>>();
вы можете определить так:
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);
Хорошо, после комментариев, я хорошо подумал... ваше право, почему бы и нет.
Выяснил это.
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>();
Посмотрите на 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.
Надеюсь, это имело смысл...