Inicializar uma matriz de ArrayList

Como posso inicializar uma Array de ArrayList ?

Eu tentei esta syntax mas não funcionou:

 ArrayList[] subsection = new ArrayList[4]; 

Essa syntax funciona bem para o ArrayList não genérico. (ideone)

Mas não vai funcionar para o genérico ArrayList : (ideone)

Este código:

 ArrayList[] subsection = new ArrayList[4]; 

Dá um erro no compilador:

 Main.java:8: criação de array genérico
         ArrayList  [] subsection = novo ArrayList <> [4];

Para a versão genérica, use um ArrayList> :

 ArrayList> subsection = new ArrayList>(); 

você pode definir assim:

 ArrayList[] lists = (ArrayList[])new ArrayList[10]; lists[0] = new ArrayList(); 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); 

Ok depois de comentar, eu pensei bem … seu direito porque não.

Descobri isso.

 ArrayList[] test = new ArrayList[4]; test[3] = new ArrayList(); test[3].add("HI"); System.out.println(test[3].get(0)); 

Embora eu seja honesto, não tenho certeza porque isso funciona.

Depois de atribuir o primeiro item de teste como uma nova coleção, ele permitirá que todos os outros itens da matriz sejam desse tipo. Então você não pode fazer

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

Olhe para os genéricos como processo de clarificação do tipo, você pode atribuir o valor typescript a uma variável do tipo bruto E vice-versa. Em core generics, há um atalho para os programadores evitarem que o tipo de conversão seja muito grande, o que também ajuda a detectar alguns erros lógicos em tempo de compilation. Nos mesmos aspectos, o ArrayList sempre implicitamente terá itens do tipo Object.

assim

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

O pouco

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

não funcionou – como era esperado, porque o HashSet simplesmente não é uma subclass de ArrayList. Genéricos não tem nada para fazer aqui. Tire os genéricos e você verá o motivo óbvio.

Contudo,

 test[2] = new ArrayList(); test[3] = new ArrayList(); 

funcionará bem, porque ambos os itens são ArrayLists.

Espero que isso tenha feito sentido …