package com.javarush.task.task10.task1015;

import java.io.IOException;
import java.util.ArrayList;

/*
Массив списков строк
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        ArrayList(String)[] arrayOfStringList = createList();
        printList(arrayOfStringList);
    }

    public static ArrayList(String)[] createList() throws IOException {
        ArrayList(ArrayList(String)) mainList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            ArrayList(String) list = new ArrayList<>();
            for (int j = 0; j < 5; j++) {
                list.add(i + ". number " + i + j);
            }
            mainList.add(list);
        }

        /*ArrayList<String>[] array = new ArrayList[mainList.size()]; вот так не проходит
          А вот так проходит. Не могу осознать в чем принципиальная разница.
          Вывод одинаковый, не принимает только валидатор, ругается на первый пункт. Разница в том, что во втором случае
          я явно делаю приведение типа (если я правильно понимаю, но мне не ясно зачем) и явно указываю размер массива
          вместо mainList().
          */

        ArrayList(String)[] array = (ArrayList(String)[]) new ArrayList[5];
        for (int k = 0; k < mainList.size(); k++) {
            array[k] = mainList.get(k);
        }
        return array;
    }

    public static void printList(ArrayList(String)[] arrayOfStringList) {
        for (ArrayList(String) list : arrayOfStringList) {
            for (String s : list) {
                System.out.println(s);
            }
        }
    }
}
Еще раз. Не могу осознать в чем принципиальная разница. Вывод одинаковый, не принимает только валидатор, ругается на первый пункт. Разница в том, что во втором случае я явно делаю приведение типа (если я правильно понимаю, но мне не ясно зачем) и явно указываю размер массива вместо mainList().