You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:52:47