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

如何从存储抽象类Persoon对象的ArrayList中筛选Lid子类对象

解决ArrayList中筛选子类对象的类型匹配问题

早上好!你遇到的问题是因为ArrayList<Persoon>里的元素可能是Lid或者Medewerker,直接往ArrayList<Lid>里加会因为类型不兼容报错——毕竟不是所有Persoon都是Lid。咱们可以通过类型判断+强制转换来解决,下面给你两种可行的写法:

方法一:传统增强for循环写法

在循环里先判断当前Persoon是不是Lid的实例,是的话再强制转换后添加到新列表:

// 获取Vereniging里的personen列表
ArrayList<Persoon> allePersonen = vereniging.getPersonen();
// 创建存储Lid的新列表
ArrayList<Lid> alleLeden = new ArrayList<>();

for (Persoon persoon : allePersonen) {
    // 判断当前对象是否为Lid类型
    if (persoon instanceof Lid) {
        // 强制转换为Lid类型后添加
        alleLeden.add((Lid) persoon);
    }
}

方法二:Java 8+ Stream流式写法(更简洁)

如果你的项目用的是Java 8及以上,用Stream API可以一行搞定筛选和转换,代码更优雅:

ArrayList<Lid> alleLeden = vereniging.getPersonen().stream()
    // 筛选出Lid类型的元素
    .filter(persoon -> persoon instanceof Lid)
    // 强制转换为Lid类型
    .map(persoon -> (Lid) persoon)
    // 收集为ArrayList
    .collect(Collectors.toCollection(ArrayList::new));

补充说明:

  • instanceof关键字用来判断一个对象是否是某个类(或其子类)的实例,这一步是必须的,否则直接强制转换可能会抛出ClassCastException。
  • 强制转换(Lid) persoon只有在已经用instanceof确认类型后才安全,不会出现运行时异常。

你的相关类代码整理:

Vereniging类

public class Vereniging { 
    private String naam; 
    private ArrayList<Persoon> personen; 
    private ArrayList<Vliegtuig> vliegtuigen; 
    private ArrayList<Vlucht> vluchten; 
    private ArrayList<Hangaar> hangaars; 
    private DataHandler handler = new Database(); 

    public Vereniging(String naam){ 
        this.naam = naam; 
        personen = new ArrayList<>(); 
        vliegtuigen = new ArrayList<>(); 
        vluchten = new ArrayList<>(); 
        hangaars = new ArrayList<>(); 
    } 

    public ArrayList<Persoon> getPersonen() { 
        return personen; 
    } 
}

Persoon类

public abstract class Persoon implements Comparable<Persoon>{ 
    private String voornaam; 
    private String tussenvoegsel; 
    private String achternaam; 
    private String woonplaats; 
    private String geslacht; 
    private String rekeningnr; 

    Persoon(String voornaam, String tussenvoegsel, String achternaam, String woonplaats, String geslacht, String rekeningnr){ 
        this.voornaam = voornaam; 
        this.tussenvoegsel = tussenvoegsel; 
        this.achternaam = achternaam; 
        this.woonplaats = woonplaats; 
        this.geslacht = geslacht; 
        this.rekeningnr = rekeningnr; 
    } 
}

Lid类

public class Lid extends Persoon { 
    private String gebnaam; 
    private String wachtwoord; 
    private String rol; 

    public Lid(String voornaam, String tussenvoegsel, String achternaam, String woonplaats, String geslacht, String rekeningnr, String gebnaam, String wachtwoord, String rol) { 
        super(voornaam, tussenvoegsel, achternaam, woonplaats, geslacht, rekeningnr); 
        this.gebnaam = gebnaam; 
        this.wachtwoord = wachtwoord; 
        this.rol = rol; 
    } 
}

内容的提问来源于stack exchange,提问作者MrEmper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:39:03