Java中如何创建多List的ArrayList?重学Java遇类型转换问题求助
Java中创建List的List时的类型转换问题解决方法
嘿,刚重新捡回Java遇到这种泛型问题太正常了,我来帮你理清楚问题出在哪以及怎么解决的。
问题根源:未指定泛型导致的类型模糊
你的初始代码里,外层的ArrayList没有声明泛型类型:
ArrayList sections = new ArrayList();
这会让Java默认把这个集合里的所有元素都视为Object类型。虽然你往里面加的都是read_lines方法返回的List<String>,但编译器无法识别这一点——当你用sections.get(x)取出元素时,得到的只是一个Object,直接尝试转成List<String>就会触发类型转换错误,也没法直接调用List的方法(比如get(3))。
初始问题代码
package src.handlers; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; public class TextManager { public static void load_chapters(){ ArrayList sections = new ArrayList(); sections.add(read_lines("src\\chapters\\0.intro.txt")); sections.add(read_lines("src\\chapters\\1.hello_world.txt")); sections.add(read_lines("src\\chapters\\2.comments.txt")); sections.add(read_lines("src\\chapters\\3.variabelen.txt")); sections.add(read_lines("src\\chapters\\4.operators.txt")); for(int x=0; x < sections.size(); x++){ // what i attempt to do -> Object current_section = sections.get(x); // This gives object conversion error when assigning as List<String> // loop here that loops all lines in current section. // cannot access cause get function says its an object not a list? System.out.println(current_section.get(3)); } } public static List<String> read_lines(String filename){ List<String> output = new ArrayList<String>(); // Probeer het bestand in te lezen. try { // Maak buffereader aan voor het inlezen met filereader module. BufferedReader read = new BufferedReader(new FileReader(filename)); String cur_line; // zolang er een nieuwe lijn word gevonden en deze niet null is -> output toevoegen aan output variabel. while((cur_line = read.readLine()) != null){ output.add(cur_line); } // Sluiten van buffer reader voor exceptions te voorkomen / latere toegang mogelijk te maken. read.close(); return output; //terugave vanalle file output. } catch(Exception e) { System.err.format("Exeption occured trying to read from '%s'.", filename); e.printStackTrace(); return null; } } }
解决方法:明确指定泛型类型
修正的核心就是给外层的ArrayList声明正确的泛型——既然你要存的是List<String>,那就把外层集合的类型指定为ArrayList<List<String>>(更推荐的写法是用接口List来声明变量,即List<List<String>> sections = new ArrayList<>();,符合Java面向接口编程的最佳实践)。
这样编译器就能明确知道sections里的每个元素都是List<String>,后续不管是用增强for循环遍历,还是用get方法取出元素,都能直接当作List<String>来操作,不需要额外的类型转换,也能正常调用List的所有方法。
修正后的代码
public static void load_chapters(){ ArrayList<List<String>> sections = new ArrayList(); sections.add(read_lines("src\\chapters\\0.intro.txt")); sections.add(read_lines("src\\chapters\\1.hello_world.txt")); sections.add(read_lines("src\\chapters\\2.comments.txt")); sections.add(read_lines("src\\chapters\\3.variabelen.txt")); sections.add(read_lines("src\\chapters\\4.operators.txt")); for(List<String> section : sections){ for(String line : section){ System.out.println(line); } } }
内容的提问来源于stack exchange,提问作者PythonNoob
相关产品推荐
相关产品推荐

