使用抽象对象转换Arraylists

时间:2018-05-28 11:06:49

标签: java object inheritance arraylist

早上好,

在编写GUI时,我遇到了Arraylist的问题。 在我的Vereniging类中,有一个包含Persoon对象的ArrayList,它们是Lid或Medewerker。 现在我需要的是从该列表中过滤掉所有Lid对象,并使用Lid对象创建一个新的Arraylist。 有谁知道这是否可能? 我尝试运行增强的for循环并将对象添加到新的Arraylist但它说数据类型不符合(尝试将Persoon添加到Lid列表)

类;

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用类型比较运算符:instanceof。这使您可以比较变量是否是类(或子类)的实例。

请参阅以下示例,该示例迭代personen列表,然后使用instanceof确定它是否实际上是Lid的实例:

List<Lid> lids = new ArrayList<>();
for(Persoon persoon : personen){
    if(persoon instanceof Lid){
        // safe cast and add to lids
        lids.add((Lid) persoon);
    }
}

如果您碰巧使用Java 8,则可以使用新的Stream API:

List<Lid> lids = personen.stream() // create a stream of persoonen
    .filter(Lid.class::isInstance) // equivalent to using instanceof
    .map(Lid.class::cast)          // equivalent to casting
    .collect(Collectors.toList()); // creating a list

答案 1 :(得分:1)

正如我所见,您想要将父对象添加到子类型的数组列表中。 因此,当您在遍历persoon列表时,使用 instanceOf 检查persoon的类型,然后键入Lid的大小写并将其添加到新列表中。

希望这能解决您的问题。

更多增强解决方案可以如下。

personen.stream().filter(p->p instanceOf Lid).map(p->(Lid)p).collect(Collectors.toList());

通过使用Java 8的流API,您可以在一行中完成。 谢谢!