#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;
}