Как я должен создать экземпляр List<Список> в Java

#java

#java

Вопрос:

У меня есть следующий код:

             List<List<String>> allData= getData()
            
            if (allData== null)
                allData= new ArrayList<ArrayList<String>>();
            // populate allData below
  

Теперь я хочу инициализировать allData , но я получаю Type mismatch: cannot convert from ArrayList<ArrayList<String>> to List<List<String>> . Как правильно я могу это инициализировать?

Невозможно вернуться ArrayList<ArrayList<String>> из getData()

Спасибо!

Комментарии:

1. allData = new ArrayList<List<String>>(); или — еще проще — пусть вывод типа выполняет свою работу: allData = new ArrayList<>();

Ответ №1:

Вы делаете это очень просто:

 allData = new ArrayList<>();
  

Затем вы можете добавлять новые списки в allData:

 List innerList = new ArrayList<>();
innerList.add("some string");
// .... etc ...
allData.add(innerList);
  

Ответ №2:

Вы не можете переопределить общий тип ссылки при создании экземпляра конкретной реализации. Ссылка List<List<String>> такова, что назначенный List должен быть способен принимать любой List<String> в качестве элемента. Когда вы создавали свой экземпляр, вы пытались ограничить это ArrayList<String> .

Явное решение:

 allData = new ArrayList<List<String>>();
  

или проще как:

 allData = new ArrayList<>();
  

Комментарии:

1. Хорошее объяснение. Плюс один к этому ответу

Ответ №3:

 A simple example of getData might be as below -
        
   public static List<List<String>> getData(String fileName){
        List<List<String>> content = null;
        try (Stream<String> lines = Files.lines(Paths.get(fileName ))) {
            content = lines
                    .map(l -> l.split(" "))
                    .map(Arrays::asList)
                    .collect(Collectors.toList());
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content;
    }