如何从存储抽象类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
相关产品推荐
相关产品推荐

